ACM小组的Samsara和Staginner对中国象棋特别感兴趣,尤其对马(可能是因为这个棋子的走法比较多吧)的使用进行深入研究。今天他们又在 构思一个古怪的棋局:假如Samsara只有一个马了,而Staginner又只剩下一个将,两个棋子都在棋盘的一边,马不能出这一半棋盘的范围,另外这 一半棋盘的大小很奇特(n行m列)。Samsara想知道他的马最少需要跳几次才能吃掉Staginner的将(我们假定其不会移动)。当然这个光荣的任 务就落在了会编程的你的身上了。
Input
每组数据一行,分别为六个用空格分隔开的正整数n,m,x1,y1,x2,y2分别代表棋盘的大小n,m,以及将的坐标和马的坐标。(1<=x1,x2<=n<=20,1<=y1,y2<=m<=20,将和马的坐标不相同)
Output
输出对应也有若干行,请输出最少的移动步数,如果不能吃掉将则输出“-1”(不包括引号)。
Sample Input
8 8 5 1 4 5
Sample Output
3
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<string> 6 #include<vector> 7 #include<stack> 8 #include<bitset> 9 #include<cstdlib> 10 #include<cmath> 11 #include<set> 12 #include<list> 13 #include<deque> 14 #include<map> 15 #include<queue> 16 #define ll long long 17 #define inf 0x3fffffff 18 using namespace std; 19 struct Node 20 { 21 int x,y,step; 22 }; 23 queue<Node> q; 24 int n,m; 25 int a[25][25]; 26 int vis[25][25]; 27 int d[][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}}; 28 29 bool check(int x,int y) 30 { 31 if(x<0||x>=n||y<0||y>=m) 32 return false; 33 if(vis[x][y]) 34 return false; 35 return true; 36 } 37 int bfs(int x1,int y1,int x2,int y2) 38 { 39 memset(vis,0,sizeof(vis)); 40 q.push( (Node){x1,y1,0} ); 41 vis[x1][y1]=1; 42 while(!q.empty()) 43 { 44 Node u=q.front(); 45 q.pop(); 46 if(u.x==x2&&u.y==y2)//到达目标 47 { 48 return u.step; 49 } 50 for(int i=0;i<8;i++)//遍历八个方向 51 { 52 int x=u.x+d[i][0]; 53 int y=u.y+d[i][1]; 54 if(check(x,y))//检查边界 55 { 56 vis[x][y]=1; 57 q.push(Node{x,y,u.step+1});//步数加1 58 } 59 } 60 } 61 return -1;//如果不能吃掉将则输出“-1” 62 } 63 64 int main() 65 { 66 int x1,y1,x2,y2; 67 while(~scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2)) 68 { 69 memset(vis,0,sizeof(vis)); 70 int ans= bfs(x2,y2,x1,y1); 71 printf("%d ",ans); 72 } 73 return 0; 74 }