ACM小组的古怪象棋

来源:互联网 发布:数控编程人员工资待遇 编辑:程序博客网 时间:2024/05/01 23:57


Description

ACM小组的Samsara和Staginner对中国象棋特别感兴趣,尤其对马(可能是因为这个棋子的走法比较多吧)的使用进行深入研究。今天他们又在 构思一个古怪的棋局:假如Samsara只有一个马了,而Staginner又只剩下一个将,两个棋子都在棋盘的一边,马不能出这一半棋盘的范围,另外这 一半棋盘的大小很奇特(n行m列)。Samsara想知道他的马最少需要跳几次才能吃掉Staginner的将(我们假定其不会移动)。当然这个光荣的任 务就落在了会编程的你的身上了。

Input

每组数据一行,分别为六个用空格分隔开的正整数n,m,x1,y1,x2,y2分别代表棋盘的大小n,m,以及将的坐标和马的坐标。(1<=x1,x2<=n<=20,1<=y1,y2<=m<=20,将和马的坐标不相同)

Output

输出对应也有若干行,请输出最少的移动步数,如果不能吃掉将则输出“-1”(不包括引号)。

Sample Input

8 8 5 1 4 5

Sample Output

3

HINT

题目大意:棋盘上有一个马和一个帅,现给定棋盘的大小及马和帅的位置,假定帅不能移动,求马最少在多少步之内能吃到帅。

这题我WA了4次,第一个错误是没有考虑到帅可能会阻挡马的路线,第二个错误是初始化t[N][N]时不小心将两个循环中都写成了n,而棋盘的大小是n*m。

#include <stdio.h>
#include <string.h>
#define MIN(a,b) ((a)<(b)?(a):(b))
#define INF 0x7fffff
#define N 20
#define M 401
struct node
{
    int x,y;
}queue[M];
int front,rear;
int t[N][N];
int dx[8]={1,-1,-2,-2,-1,1,2,2};
int dy[8]={2,2,1,-1,-2,-2,-1,1};
int vis[N][N];
int n,m,si,sj,ei,ej;
void bfs(int x,int y)
{
    int i,j,ni,nj,d;
    front=rear=0;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)    t[i][j]=INF;
    t[x][y]=0;
    memset(vis,0,sizeof(vis));
    vis[x][y]=1;
    queue[rear].x=x,queue[rear++].y=y;
    while(front!=rear)
    {
        i=queue[front].x,j=queue[front].y;
        front=(front+1)%M;
        for(d=0;d<8;d++)
        {
            ni=i+dx[d],nj=j+dy[d];
            if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj])  continue;
            if(dx[d]==2&&ej==j&&ei==(i+1))  continue;
            if(dx[d]==-2&&ej==j&&ei==(i-1)) continue;
            if(dy[d]==2&&ei==i&&ej==(j+1))  continue;
            if(dy[d]==-2&&ei==i&&j==(j-1))  continue;
            t[ni][nj]=MIN(t[ni][nj],t[i][j]+1);
            if(ni==ei&&nj==ej)  return;
            vis[ni][nj]=1;
            queue[rear].x=ni,queue[rear].y=nj;
            rear=(rear+1)%M;
        }
    }
}
int main()
{
    while(~scanf("%d%d%d%d%d%d",&n,&m,&ei,&ej,&si,&sj))
    {
        si--,sj--,ei--,ej--;
        bfs(si,sj);
        if(t[ei][ej]==INF)  printf("-1\n");
        else    printf("%d\n",t[ei][ej]);
    }
    return 0;
}


0 0
原创粉丝点击