zoukankan      html  css  js  c++  java
  • POJ 2243:Knight Moves(BFS)

    可以理解为象棋中的马走“日”字形,从第一个位置到第二个位置所需的最短步数,简单的BFS

    每走一步需判断一次是否到达目标点。

    由于BFS写得不多,一直用DFS的思维理解,递归写一直溢出、超时~~

    #include"cstdio"
    #include"iostream"
    #include"cstring"
    #include"queue"
    using namespace std;
    int dx[8]={-1,1,-2,2,-2,2,-1,1};
    int dy[8]={-2,-2,-1,-1,1,1,2,2};
    int vis[10][10];
    struct point
    {   int x;
        int y;
        int level;
    };
    bool judge(point p)
    {   if(vis[p.x][p.y]||p.x>8||p.x<=0||p.y>8||p.y<=0) return false;
        return true;
    }
    int main()
    {   char a1,b;
        int ans;
        point p1,p2;
        while(scanf("%c%d %c%d",&a1,&p1.y,&b,&p2.y)!=EOF)
        {   getchar();
            memset(vis,0,sizeof(vis));
            ans=0;
            p1.x=a1-'a'+1;p2.x=b-'a'+1;
            p1.level=0;
            queue<point> q;
            q.push(p1);
            vis[p1.x][p1.y]=1;
            point a;
            while(!q.empty())
            {
                a=q.front();
                q.pop();
                if(a.x==p2.x&&a.y==p2.y) {ans=a.level;break;}
                for(int i=0;i<8;i++)
                {   point temp;
                    temp.x=a.x+dx[i];
                    temp.y=a.y+dy[i];
                    temp.level=a.level+1;
                    if(judge(temp))
                    {   vis[temp.x][temp.y]=1;
                        q.push(temp);
                    }
                }
            }
            printf("To get from %c%d to %c%d takes %d knight moves.
    ",a1,p1.y,b,p2.y,ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    01-节点层次
    WebAPI02
    WebAPI01
    牛客剑指Offer7
    Python字典排序
    Python字典中的键映射多个值
    计算机硬件的主要技术指标
    计算机的基本组成
    计算机系统概论
    数据库概论
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/4670918.html
Copyright © 2011-2022 走看看