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 }

 

你可能感兴趣的:(OJ)