棋盤中的馬

棋盤中的馬

棋盤中有一個馬,給出它的位置,它有一個目的地,請問它最少需要多少步才能走到它的目的地。

輸入

•輸入:第一行兩個整數:n,m,(n<=1000,m<=1000)表示棋盤有n行m列。第一行第一列爲(1,1).
•第二行:x1,y1,表示馬的位置。
•第三行:x2,y2,表示它的目的地。
•保證起始和終止位置都在棋盤內。
如果馬不能到達目的地,輸出-1.

輸出

馬走到目的地所需的最少步數

樣例輸入

3 5
2 5
1 1

樣例輸出

3

代碼如下

#include<cstdio>
int quex[1000005],quey[1000005],ques[1000005];
int dr[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
//dr是方向數組,quex,quey,ques是隊列數組(可以用結構體),ques是擴展的層數
bool book[1005][1005],flag;
//book標記走過的點,flag用來判斷是否找到,和退出循環
int main()
{
    int n,m,x1,y1,x2,y2,xx,yy,head,tail;
    head=tail=1;
//隊頭和隊尾出始值爲1
    scanf("%d%d",&n,&m);
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    quex[tail]=x1;
    quey[tail]=y1;
    ques[tail]=0;
    tail++;
    //把起點座標入隊,tail指向隊尾後一個元素
    book[x1][y1]=1;
    //標記起點
    while(head<tail)
    //當隊頭與對尾指向同一個位置時退出循環
    {
        for(int i=0;i<8;i++)
        //枚舉8個方向
        {
            xx=quex[head]+dr[i][0];
            yy=quey[head]+dr[i][1];
            if(xx>0&&yy>0&&xx<=n&&yy<=m&&book[xx][yy]==0)
            {
                book[xx][yy]=1//標記走過的點
                quex[tail]=xx;
                quey[tail]=yy;
                ques[tail]=ques[head]+1;
                tail++;
                //將現在的座標入隊,並且tail指向隊尾的後一個元素,
                //層數是待擴展節點的層數+1
            }
            if(xx==x2&&yy==y2){flag=1;break;}
            //當馬到達終點,退出循環
        }
        if(flag==1)break;
        //如果找到了,退出循環
        head++;
        //擴展結束,再換下一個擴展
    }
    if(flag==0)printf("-1");
    else printf("%d",ques[tail-1]);
    //flag=0時,沒有找到,因爲tail指向的始終是隊尾的後一個元素,所以減1
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章