题意:
马走日字,从一个点走到另一个点。
分析:
简单的bfs,卡了我很久。可以说第一个自己写的bfs。哈哈,在经过几次RE(悲剧啊)之后成功AC。
遇到的几个问题:
1.一开始,队列没有预先清空,导致上一次入队的下次还在。
2、也是最悲剧的,卡时间就卡在这里。定义源和目标是因为只有两个字母,所以只用了2个空间存取,后来改了很多还是re,无语了,最后略剽一眼代码发现了以前也碰到的问题会不会字符串‘\0'没有包含进去,结果还真是这样。想问题还是不完整啊。
#include <iostream> #include <queue> #include<cstdio> using namespace std; typedef struct point{ int x,y; int moves; }point; queue<point>Q; int e_x,e_y; int map[10][10]; int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}}; int bfs(point s); int main() { char start[5],end[5];//'\0'. int s_x,s_y; int ans,i,j; point head; while(scanf("%s%s",start,end)!=EOF) { s_x=start[0]-'a'+1; s_y=start[1]-'0'; e_x=end[0]-'a'+1; e_y=end[1]-'0'; head.moves=0; head.x=s_x; head.y=s_y; while(!Q.empty ()) Q.pop();//清空队列,上一次的队列还有的 for(i=0;i<10;i++) for(j=0;j<10;j++) map[i][j]=0; ans=bfs(head); printf("To get from %s to %s takes %d knight moves.\n",start,end,ans); } return 0; } int bfs(point s) { int j,x,y; point head,t; map[s.x][s.y]=1; Q.push (s); while(!Q.empty ()) { head=Q.front (); Q.pop(); if(head.x==e_x&&head.y==e_y) return head.moves; for(j=0;j<8;j++) { x=head.x+dir[j][0]; y=head.y+dir[j][1]; if(x>0&&x<=8&&y>0&&y<=8&&map[x][y]==0) { map[x][y]=1; t.x=x; t.y=y; t.moves=head.moves+1; Q.push(t); } } } }