标签:sar style code 这一 ring acm names 今天 else
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
用BFS,注意马的蹩脚。
1 #include<iostream> 2 #include<queue> 3 #include<string.h> 4 5 using namespace std; 6 7 bool a[22][22]; 8 9 typedef struct 10 { 11 int x,y,step; 12 }node; 13 14 int dx[8]={1,-1,-2,-2,-1,1,2,2}; 15 int dy[8]={2,2,1,-1,-2,-2,-1,1}; 16 17 int main() 18 { 19 int n,m,x1,y1,x2,y2,x,y; 20 while(scanf("%d%d%d%d%d%d",&m,&n,&x2,&y2,&x1,&y1)!=EOF) 21 { 22 memset(a,false,sizeof(a)); 23 queue<node> q; 24 node f,f1; 25 int flag=0; 26 f.step=0;f.x=x1;f.y=y1; 27 q.push(f); 28 while(!q.empty()) 29 { 30 f1=q.front(); 31 q.pop(); 32 a[f1.x][f1.y]=true; 33 if(f1.x==x2&&f1.y==y2) 34 { 35 flag=1; 36 break; 37 } 38 else 39 { 40 for(int i=0;i<8;i++) 41 { 42 x=f1.x+dx[i]; 43 y=f1.y+dy[i]; 44 if(x<1||y<1||x>m||y>n||a[x][y]) continue; 45 if(dx[i]==2&&x2==(f1.x+1)&&y2==f1.y) continue; 46 if(dx[i]==-2&&x2==(f1.x-1)&&y2==f1.y) continue; 47 if(dy[i]==2&&x2==f1.x&&y2==(f1.y+1)) continue; 48 if(dy[i]==-2&&x2==f1.x&&y2==(f1.y-1)) continue; 49 f.x=x; 50 f.y=y; 51 f.step=f1.step+1; 52 q.push(f); 53 } 54 } 55 } 56 if(flag) 57 cout<<f1.step<<endl; 58 else 59 cout<<-1<<endl; 60 } 61 62 return 0; 63 }
标签:sar style code 这一 ring acm names 今天 else
原文地址:http://www.cnblogs.com/xibeiw/p/7265393.html