• 骑士问题(knight) (BFS)


    题目描述

    在一个标准8×8的国际象棋棋盘上,棋盘中有些格子可能是有障碍物的。已知骑士的初始位置和目标位置,你的任务是计算出骑士最少需要多少步可以从初始位置到达目标位置。有障碍物的格子当然不可以到达。
    标准的8×8的国际象棋棋盘中每一个格子可以用唯一的编号确定。行用1~8这8个数字依次表示,列用a~h这8个字母依次表示。例如图中的骑士所在位置(图中有n的格子)的编号为“d4”(注意d和4之间没有空格)。

    我们知道国际象棋中的骑士可以按“L”路线移动(一个方向走2个格子,接着垂直方向走1个格子)。因此,图中的骑士(位于d4),可以到达位置c2、b3、b5、c6、e6、f5、f3和e2(图中有“x”标记的格子)。此外,骑士不能移出棋盘。
    骑士可以按照移动规则自由地在棋盘上没有障碍物的格子中移动,图中给出了一个骑士移动的例子。初始格子用“n”标记,目标格子用“N”标记,有障碍物的格 子用“b”标记。一个可行的移动序列在图中用数字标记出来(al,b3,a5,c6,e5,94,h2,fl),总共需要7步才能完成。事实上,这也就是 最小的步数了。

    输入

    输入文件包括1个或多个测试数据。
    每1个测试数据的第1行是一个整数b(-1≤b≤62),表示棋盘中有障碍物的格子数目,当b=-1时,输入文件结束;
    第2行含b个不同的有障碍物的格子编号,用空格隔开。当b=0 时,此行为空行;
    第3行是骑士的初始格子和目标格子的编号,也是用空格隔开。初始格子和目标格子是不同的,且都没有障碍物。

    输出

    对于每个数据,输出1行。格式:Board n:m moves,其中n表示数据的序号(从1开始),m表示骑士所用的最小的步数。如果骑士无法到达目标格子,输出:Board n:not reachable。

    样例输入

    8
    c5 b4 c1 b2 e1 e5 f4 f2 
    d3 h8
    8
    e8 e7 e6 e5 e4 e3 e2 e1
    d3 h8
    -1
    

    样例输出

    Board 1: not reachable
    Board 2: 3 moves
    
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define pi acos(-1.0)
    #define inf 0x3f3f3f3f
    using namespace std;
    int n,m,flag,a,b;
    int dis[8][2]= {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
    int vis[15][15];
    int w[15][15];
    string str;
    struct man
    {
        int x,y,step;
    };
    queue<man>q;
    void bfs(man s,int enx,int eny)
    {
        q.push(s);
        vis[s.x][s.y]=1;
        while(!q.empty())
        {
            man t=q.front();
            q.pop();
            //printf("%d %d %d
    ",t.x,t.y,t.step);system("pause");
            if(t.x==enx&&t.y==eny)
            {
                printf("%d moves
    ",t.step);
                flag=1;
                return;
            }
            for(int i=0; i<8; i++)
            {
                int xx=t.x+dis[i][0];
                int yy=t.y+dis[i][1];//
                //printf("%d %d
    ",xx,yy);
                if(xx>=0&&xx<8&&yy>=0&&yy<8&&w[xx][yy]!=1&&vis[xx][yy]==0)
                {
                    man k;
                    k.x=xx;
                    k.y=yy;
                    k.step=t.step+1;
                    q.push(k);
                    vis[xx][yy]=1;
                }
            }
        }
    }
    int main()
    {
        int g,h;int cnt=0;
        while(~scanf("%d",&n))
        {cnt++;flag=0;
            while(!q.empty())q.pop();
            int enx;int eny;
            
            if(n==-1)break;
            memset(vis,0,sizeof(vis));
            memset(w,0,sizeof(w));
            while(n--)
            {
                cin>>str;
                w[str[0]-'a'][str[1]-'1']=1;
            }
            string sta,en;
            cin>>sta>>en;
            man s;s.x=sta[0]-'a';s.y=sta[1]-'1';s.step=0;q.push(s);
            enx=en[0]-'a';eny=en[1]-'1';
            printf("Board %d: ",cnt);
            bfs(s,enx,eny);
            if(flag==0)puts("not reachable");
        }
     
        return 0;
    }
    帅得不要不要的
    
    
  • 相关阅读:
    Comparison of Performance Testing Tools
    软件测试两年总结
    利用FSO生成QTP测试报告
    Web 2.0 再思考(三)「搭讪」是需要理由的
    脑子里想的是A,嘴巴上说的是B,实际上做的是C,幻想前景远大的是D,可真正赚钱的恰恰却是E
    东莞镇区实力排名榜
    狂籌資計畫
    转载:日剧和韩剧的区别
    Web 2.0 再思考(一)「关系」才是重点
    炒股
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5702981.html
Copyright © 2020-2023  润新知