COJ1046(追杀)

Description

在一个89列的国际象棋棋盘上,有一名骑士在追杀对方的国王。该骑士每秒跨越一个2*3的区域,如下图所示。

 

 

而对方的国王慌忙落逃,他先沿着右下斜线方向一直跑,遇到边界以后会沿着光线反射方向继续跑(遇到死角则原路返回),他每秒只跑一格。

给出骑士和国王的初始位置,求最快在多少秒的时候骑士能追杀掉对方的国王。骑士和国王每一秒都必须要有行动,而不能原地等待。

Input

有多组测试数据。对于每组测试数据,输入只有一行:nx,ny,kx,ky,前2个表示骑士的初始坐标,后2个表示国王的初始坐标,以左上角的格子为(0,0),向右为x轴正方向,向下为y轴正方向。(0<=nx,kx<=8,0<=ny,ky<=7)

Output

    对于每组测试数据,仅输出一个整数,即骑士追杀到国王的最快时刻。初始位置的时刻为0。追杀到的时刻是指骑士和国王处在同一格的时刻。

Sample Input

0 7 0 0

Sample Output

3

这是典型的BFS题,状态可设计为骑士的位置,国王的位置,国王当前的逃跑方向,关键在于状态的转换,国王当前的位置和方向可由上一个位置和方向确定,关于反射和原路返回的处理,我是直接模拟的,一开始反射理解错了,比如在(2,7)往右下移动,应该反射为(3,6),我理解成了(3,7),所以WA了一次。
View Code
  1 #include <stdio.h>
  2 #include <queue>
  3 #define N 10
  4 using namespace std; 
  5 int dx[8]={1,-1,-2,-2,-1,1,2,2};
  6 int dy[8]={2,2,1,-1,-2,-2,-1,1};
  7 int dkx[4]={1,-1,-1,1};
  8 int dky[4]={-1,-1,1,1};
  9 typedef struct node
 10 {
 11   int nx,ny,kx,ky;
 12   int d;
 13 }node;
 14 node cur,next;
 15 queue<node> Q;
 16 int nx,ny,kx,ky;
 17 int t[N][N][N][N][4];
 18 node tran(node tmp,int k)
 19 {
 20   int x1,x2,y1,y2,d;
 21   int nx1,nx2,ny1,ny2,nd;
 22   x1=tmp.nx;
 23   y1=tmp.ny;
 24   x2=tmp.kx;
 25   y2=tmp.ky;
 26   d=tmp.d;
 27   nx1=x1+dx[k];
 28   ny1=y1+dy[k];
 29   if(nx1<0 || ny1<0 || nx1>8 || ny1>7)
 30   {
 31     tmp.d=-1;
 32     return tmp;
 33   }
 34   if(x2==0 && y2==0 && d==1)
 35   {
 36     nx2=1;
 37     ny2=1;
 38     nd=3;
 39   }
 40   else if(x2==8 && y2==0 && d==0)
 41   {
 42     nx2=7;
 43     ny2=1;
 44     nd=2;
 45   }
 46   else if(x2==0 && y2==7 && d==2)
 47   {
 48     nx2=1;
 49     ny2=6;
 50     nd=0;
 51   }
 52   else if(x2==8 && y2==7 && d==3)
 53   {
 54     nx2=7;
 55     ny2=6;
 56     nd=1;
 57   }
 58   else if(x2==0 && (d==1 || d==2) )
 59   {
 60     nx2=1;
 61     if(d==1)
 62     {
 63       ny2=y2-1;
 64       nd=0;
 65     }
 66     else
 67     {
 68       ny2=y2+1;
 69       nd=3;
 70     }
 71   }
 72   else if(x2==8 && (d==0 || d==3) )
 73   {
 74     nx2=7;
 75     if(d==0)
 76     {
 77       ny2=y2-1;
 78       nd=1;
 79     }
 80     else
 81     {
 82       ny2=y2+1;
 83       nd=2;
 84     }
 85   }
 86   else if(y2==0 && (d==0 || d==1) )
 87   {
 88     ny2=1;
 89     if(d==0)
 90     {
 91       nx2=x2+1;
 92       nd=3;
 93     }
 94     else
 95     {
 96       nx2=x2-1;
 97       nd=2;
 98     }
 99   }
100   else if(y2==7 && (d==2 || d==3) )
101   {
102     ny2=6;
103     if(d==2)
104     {
105       nx2=x2-1;
106       nd=1;
107     }
108     else
109     {
110       nx2=x2+1;
111       nd=0;
112     }
113   }
114   else
115   {
116     nx2=x2+dkx[d];
117     ny2=y2+dky[d];
118     nd=d;
119   }
120   if(t[nx1][ny1][nx2][ny2][nd]>=0)
121   {
122     tmp.d=-1;
123     return tmp;
124   }
125   t[nx1][ny1][nx2][ny2][nd]=t[x1][y1][x2][y2][d]+1;
126   tmp.nx=nx1;
127   tmp.ny=ny1;
128   tmp.kx=nx2;
129   tmp.ky=ny2;
130   tmp.d=nd;
131   return tmp;
132 }
133 void bfs()
134 {
135   bool success=false;
136   int x1,x2,y1,y2,d,ans;
137   while(!Q.empty()) Q.pop();
138   memset(t,0xff,sizeof(t));
139   t[nx][ny][kx][ky][3]=0;
140   cur.nx=nx;
141   cur.ny=ny;
142   cur.kx=kx;
143   cur.ky=ky;
144   cur.d=3;
145   Q.push(cur);
146   while(!success && !Q.empty())
147   {
148     cur=Q.front(),Q.pop();
149     x1=cur.nx;
150     y1=cur.ny;
151     x2=cur.kx;
152     y2=cur.ky;
153     d=cur.d;
154     if(x1==x2 && y1==y2)
155     {
156       success=true;
157       ans=t[x1][y1][x2][y2][d];
158     }
159     for(int i=0;i<8 && !success;i++)
160     {
161       next=tran(cur,i);
162       if(next.d>=0)  Q.push(next);
163     }
164   }
165   printf("%d\n",ans);
166 }
167 int main()
168 {
169   while(~scanf("%d%d%d%d",&nx,&ny,&kx,&ky)) bfs();
170   return 0;
171 }

 

posted @ 2012-07-03 18:41  BeatLJ  阅读(216)  评论(1编辑  收藏  举报