JZOJ_7.9C组第二题 骑士问题

题意

给出一个8*8的棋盘,上面有一些障碍物,我们知道骑士是走L形的,现在给出骑士的坐标和终点坐标,求出骑士能到达的最少步数,如果不能到达就输出not reachable。

思路

就是一个简单的BFS模板题,注意细节就好了。

代码

#include
#include
using namespace std;
int ans,head,tail,n,a,b,xp1,yp1,xp2,yp2,x,y,state[10001][2],father[10001],cnt;//0x,1y;
bool map[9][9];
char c[2];
short dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={2,1,-1,-2,2,1,-1,-2};
bool check()
{
    for (int i=1;i<=head;i++)
        if (state[tail][1]==state[i][1]&&state[tail][0]==state[i][0]) return 0;
    return 1;
}
void Ans(int x)
{
    while (father[x]!=0)
    {
        ans++;
        x=father[x];
    }
}
void bfs()
{   
    if (xp1==xp2&&yp1==yp2) return;
    state[1][0]=xp1;state[1][1]=yp1;
    head=0;tail=1;
    do
    {
        head++;
        for (int i=0;i<8;i++)
        {
            x=state[head][0]+dx[i];y=state[head][1]+dy[i];
            if (x>8||x<1||y>8||y<1||map[x][y]) continue;
            state[++tail][0]=x;state[tail][1]=y;
            if (!check()) {tail--;continue;}
            father[tail]=head;          
            if (state[tail][0]==xp2&&state[tail][1]==yp2) {Ans(tail);return;}
        }
    }
    while (head1;
}
int main()
{
    while (scanf("%d",&n),n!=-1)
    {
        ans=0;
        memset(map,0,sizeof(map));
        for (int i=1;i<=n;i++)
        {
            scanf("%s",c);
            a=c[0]-96;b=c[1]-48;
            map[a][b]=1;
        }
        scanf("%s",c);
        xp1=c[0]-96;yp1=c[1]-48;
        scanf("%s",c);
        xp2=c[0]-96;yp2=c[1]-48;
        bfs();
        if (ans!=-1) printf("Board %d: %d moves\n",++cnt,ans);
        else printf("Board %d: not reachable\n",++cnt);
    }
}

你可能感兴趣的:(jzoj)