HDU 1372 Knight Moves

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1372


这道题目是关于中国象棋的,问中国象棋里面马从一个地方跳到另一个地方最少需要多少步。

我们知道在正常范围内,马可以向8个方向跳。


简单搜索,BFS


题目代码:(代码每一步很清楚)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

/*
freopen("input.txt",  "r", stdin);
freopen("output.txt", "w", stdout);
*/

int bx,by,ex,ey;
bool visit[10][10];//标记是否走过
int t[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};//8个方向

struct xh
{
    int x,y,s;
}w,ww;

bool test(int x,int y)//判断
{
    return x>=1&&x<=8&&y>=1&&y<=8&&visit[x][y];
}

int bfs()
{
    queue<xh>q;
    memset(visit,true,sizeof(visit));
    w.x=bx;
    w.y=by;
    w.s=0;
    visit[bx][by]=false;
    q.push(w);
    while(!q.empty())
    {
        ww=q.front();
        q.pop();
        if(ww.x==ex&&ww.y==ey)
            return ww.s;
        for(int i=0;i<8;i++)
        {
            w=ww;
            w.x+=t[i][0];
            w.y+=t[i][1];
            if(test(w.x,w.y))
            {
                visit[w.x][w.y]=false;
                w.s++;
                q.push(w);
            }
        }
    }
}

int main()
{
    int i,j;
    char s1[5],s2[5];
    while(cin>>s1>>s2)
    {
        bx=s1[0]-'a'+1;
        by=s1[1]-'0';
        ex=s2[0]-'a'+1;
        ey=s2[1]-'0';
        printf("To get from %s to %s takes ",s1,s2);
        if(s1==s2)
            printf("0");
        else
            printf("%d",bfs());
        printf(" knight moves.\n");
    }
    return 520;
}


你可能感兴趣的:(HDU 1372 Knight Moves)