题目大意:棋盘上有一个马和一个帅,现给定棋盘的大小及马和帅的位置,假定帅不能移动,求马最少在多少步之内能吃到帅。
这题我WA了4次,第一个错误是没有考虑到帅可能会阻挡马的路线,第二个错误是初始化t[N][N]时不小心将两个循环中都写成了n,而棋盘的大小是n*m。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define INF 0x7fffff 5 #define N 20 6 #define M 401 7 struct node 8 { 9 int x,y; 10 }queue[M]; 11 int front,rear; 12 int t[N][N]; 13 int dx[8]={1,-1,-2,-2,-1,1,2,2}; 14 int dy[8]={2,2,1,-1,-2,-2,-1,1}; 15 int vis[N][N]; 16 int n,m,si,sj,ei,ej; 17 void bfs(int x,int y) 18 { 19 int i,j,ni,nj,d; 20 front=rear=0; 21 for(i=0;i<n;i++) 22 for(j=0;j<m;j++) t[i][j]=INF; 23 t[x][y]=0; 24 memset(vis,0,sizeof(vis)); 25 vis[x][y]=1; 26 queue[rear].x=x,queue[rear++].y=y; 27 while(front!=rear) 28 { 29 i=queue[front].x,j=queue[front].y; 30 front=(front+1)%M; 31 for(d=0;d<8;d++) 32 { 33 ni=i+dx[d],nj=j+dy[d]; 34 if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj]) continue; 35 if(dx[d]==2&&ej==j&&ei==(i+1)) continue; 36 if(dx[d]==-2&&ej==j&&ei==(i-1)) continue; 37 if(dy[d]==2&&ei==i&&ej==(j+1)) continue; 38 if(dy[d]==-2&&ei==i&&j==(j-1)) continue; 39 t[ni][nj]=MIN(t[ni][nj],t[i][j]+1); 40 if(ni==ei&&nj==ej) return; 41 vis[ni][nj]=1; 42 queue[rear].x=ni,queue[rear].y=nj; 43 rear=(rear+1)%M; 44 } 45 } 46 } 47 int main() 48 { 49 while(~scanf("%d%d%d%d%d%d",&n,&m,&ei,&ej,&si,&sj)) 50 { 51 si--,sj--,ei--,ej--; 52 bfs(si,sj); 53 if(t[ei][ej]==INF) printf("-1\n"); 54 else printf("%d\n",t[ei][ej]); 55 } 56 return 0; 57 }