UVA 439 跳马(国际象棋里的骑士)BFS

这个问题是一个简单的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);

    }

}

较有成就感

猜你喜欢

转载自blog.csdn.net/h201601060805/article/details/77641787
今日推荐