HDU1372 Knight Moves
题目:HDU1372
题解:闲暇之余来巩固一下BFS...记得之前好像写了一个只能往右跳的棋盘问题,这个是八个方向都能跳。就像象棋中的“马”那样。
所以用BFS往八个方向遍历就行
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #define maxn 10 5 using namespace std; 6 7 int x1,y1,x2,y2,dis[maxn][maxn]; 8 char c1,c2; 9 bool f[maxn][maxn]; 10 int way[]={-2,-2,-1,1,2,2,1,-1}; 11 12 void bfs(int x1,int y1,int x2,int y2) 13 { 14 int x,y,xx,yy; 15 queue<pair<int,int> > q; 16 q.push(pair<int,int>(x1,y1)); 17 f[x1][y1]=false; 18 memset(f,true,sizeof(f)); 19 memset(dis,0,sizeof(dis)); 20 21 while(!q.empty()) 22 { 23 x=q.front().first; 24 y=q.front().second; 25 q.pop(); 26 if(x==x2&&y==y2) break; 27 28 for(int i=0;i<8;i++) 29 { 30 xx=x+way[i];yy=y+way[7-i]; 31 if(xx>=1&&xx<=8&&yy>=1&&yy<=8&&f[xx][yy]) 32 { 33 q.push(pair<int,int>(xx,yy)); 34 f[xx][yy]=false; 35 dis[xx][yy]=dis[x][y]+1; 36 } 37 } 38 } 39 } 40 41 int main() 42 { 43 while(scanf("\n%c%d %c%d",&c1,&y1,&c2,&y2)!=EOF) 44 { 45 x1=c1-96;x2=c2-96; 46 47 48 bfs(x1,y1,x2,y2); 49 50 printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,y1,c2,y2,dis[x2][y2]); 51 } 52 53 return 0; 54 }
浙公网安备 33010602011771号