题意:
马走日字,从一个点走到另一个点。
分析:
简单的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);
}
}
}
}