Description
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
Hint
思路:bfs ,推出在有无马脚的情况下结果是一样的结论
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define MAXN 100010 struct node{ int x,y,sum; }; queue<node>q; int vis[25][25],sum; int dir[8][2]={2,1,1,2,-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1}; int n,m,x_1,x_2,y_1,y_2; bool check(int x,int y) { if(x>=1&&y>=1&&x<=n&&y<=m&&!vis[x][y]) return true; return false; } int bfs() { node u,v; while(!q.empty()) { u=q.front(); q.pop(); for(int i=0;i<8;i++) { v.x=u.x+dir[i][0]; v.y=u.y+dir[i][1]; v.sum=u.sum+1; if(check(v.x,v.y)) { if(v.x==x_1&&v.y==y_1) return v.sum; vis[v.x][v.y]=1; q.push(v); } } } return 0; } int main() { int T; while(~scanf("%d%d%d%d%d%d",&n,&m,&x_1,&y_1,&x_2,&y_2)) { memset(vis,0,sizeof(vis)); while(!q.empty()) q.pop(); node u; u.x=x_2;u.y=y_2;u.sum=0; q.push(u); vis[x_2][y_2]=1; int num=bfs(); if(num) printf("%d ",num); else printf("-1 "); } return 0; } /********************************************************************** Problem: 1224 User: leo6033 Language: C++ Result: AC Time:4 ms Memory:1936 kb **********************************************************************/