这个问题是一个简单的BFS,每个地方被访问了就添加进去就行,超级水的一道题目,初学者做出来比较有成就感
顺便一提 如果想掌握 turn_row这种写法建议去看UVA816 abbott 的复仇 超级好用哈哈哈哈
#include <bits/stdc++.h>
using namespace std;
const char * row = "abcdefgh";
int turn_row(char c)
{
return strchr(row,c) - row+1;
}
int dx[] = {2,1,2,1,-2,-1,-2,-1};
int dy[] = {1,2,-1,-2,1,2,-1,-2};
struct node
{
int x,y,v;
node(int xx, int yy, int vv):x(xx),y(yy),v(vv){}
};
int sx,sy,ex,ey;
char op,ed;
int a[20][20],vis[20][20];
int bfs()
{
node no(sx,sy,0);
vis[sx][sy] = 1;
queue<node> Q;
Q.push(no);
while(!Q.empty())
{
node now = Q.front();
Q.pop();
int x = now.x;
int y = now.y;
if(x == ex && y == ey)
{
return now.v;
}
for(int i = 0; i < 8 ; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 1 && xx <= 8 && yy >= 1 && yy <= 8 && !vis[xx][yy])
{
vis[xx][yy] =1;
node after(xx,yy,now.v+1);
if(xx == ex && yy == ey)
{
return after.v;
}
Q.push(after);
}
}
}
}
int main()
{
//freopen("s.txt","w",stdout);
while(scanf("%c%d %c%d",&op,&sy,&ed,&ey)!=EOF)
{
getchar();
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
//cout<<op<<" "<<sy<<" "<<ed<<" "<<ey<<endl;
sx = turn_row(op);ex = turn_row(ed);
int tt = bfs();
printf("To get from %c%d to %c%d takes %d knight moves.\n",op,sy,ed,ey,tt);
}
}
较有成就感