COJ1046(追杀)
Description
在一个8行9列的国际象棋棋盘上,有一名骑士在追杀对方的国王。该骑士每秒跨越一个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了一次。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }