原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372
分析:
题目大意:在8*8的方格中,给你一个起始点和结束点,问走“日”步,从起始点到结束点最少要几步。
用广搜,搜到的点就是最少步数得到的点。
我的代码:
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int x[]={-2,-2,-1,-1,1,1,2,2};
int y[]={1,-1,2,-2,2,-2,1,-1};
bool visited[9][9];
int sx,sy,ex,ey;
int ans;
struct Node
{
int x,y;
int num; //走到(x,y)要的步数。
};
queue<Node> Q;
void BFS()
{
while(!Q.empty()) Q.pop();
Node S;
S.x=sx;
S.y=sy;
S.num=0;
Q.push(S);
visited[sx][sy]=1;
while(!Q.empty())
{
Node T=Q.front();
if(T.x==ex&&T.y==ey)
{
ans=T.num;
break;
}
Q.pop();
for(int i=0;i<8;i++) //搜索8个方向的“日”字步
{
int nx=T.x+x[i];
int ny=T.y+y[i];
if(nx>=1&&nx<=8&&ny>=1&&ny<=8&&!visited[nx][ny])
{
visited[nx][ny]=1;
Node P;
P.x=nx;
P.y=ny;
P.num=T.num+1;
Q.push(P);
}
}
}
}
int main()
{
char s1[5],s2[5];
while(~scanf("%s%s",s1,s2))
{
sx=s1[0]-'a'+1; sy=s1[1]-'0';
ex=s2[0]-'a'+1; ey=s2[1]-'0';
memset(visited,0,sizeof(visited));
BFS();
printf("To get from %s to %s takes %d knight moves.\n",s1,s2,ans);
}
return 0;
}
总结:用了visited标记数组后由90+MS变成15MS。。