UVA_439 Knight Moves

UVA_439 Knight Moves

题意

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

解决

  1. 我大概是傻了,刚开始还不知道要怎么做…
  2. 之前做的BFS题移动方向都是”上下左右”或者是”八连通”,一看到”走日字”就转不过弯了(⊙o⊙)…
  3. 所以这个题就是裸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]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值