您的位置:首页 > 其它

UVA_439 Knight Moves

2017-08-16 07:20 656 查看

UVA_439 Knight Moves

题意

给出一个标准的象棋棋盘,给出马的起始位置和目标位置,问最少要跳几次

解决

我大概是傻了,刚开始还不知道要怎么做…

之前做的BFS题移动方向都是”上下左右”或者是”八连通”,一看到”走日字”就转不过弯了(⊙o⊙)…

所以这个题就是裸BFS

int maps[9][9],dis[9][9];
int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
int vis[9][9];
struct point
{
int x,y;
point(int xx,int yy){x=xx;y=yy;}
};
void bfs(point st,point ed)
{
queue<point> Q;
Q.push(st);
while(!Q.empty())
{
point ans=Q.front();
Q.pop();
if(ans.x==ed.x&&ans.y==ed.y) return ;
rep(i,0,8){
int nx=ans.x+dir[i][0],ny=ans.y+dir[i][1];
if(nx>0&&ny>0&&nx<9&&ny<9&&!vis[nx][ny])
{
vis[nx][ny]=1;
dis[nx][ny]=dis[ans.x][ans.y]+1;
Q.push(point(nx,ny));
}
}
}
}
int main()
{
//open();
char c1,c2;
int x,y,xx,yy;
while(~scanf("%c%d %c%d",&c1,&y,&c2,&yy))
{
getchar();
x=(c1+1)-'a';
xx=(c2+1)-'a';
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
point st(x,y),ed(xx,yy);

vis[x][y]=1;
dis[x][y]=0;
bfs(st,ed);
printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,y,c2,yy,dis[xx][yy]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva bfs