hdu Knight Moves
这道题实到bfs的题目,很简单,不过搜索的方向变成8个而已,对于不会下象棋的会有点晕。
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int c[9][9]; int dir[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}}; typedef struct { int x,y,count; }node; node start,finish; int bfs() { memset(c,0,sizeof(c)); node pre,cur; start.count = 0; queue<node> q; q.push(start); c[start.x][start.y] = 1; while(!q.empty()) { pre = q.front(); q.pop(); if(pre.x == finish.x&&pre.y == finish.y) return pre.count; for(int i = 0; i < 8; i++) { cur.x = pre.x + dir[i][0]; cur.y = pre.y + dir[i][1]; if(cur.x<1||cur.x>8||cur.y<1||cur.y>8)continue; if(c[cur.x][cur.y]==1)continue; c[cur.x][cur.y] = 1; cur.count = pre.count + 1; q.push(cur); } } return -1; } int main() { char row,end; int col,ed; int min; while(scanf("%c",&row)!=EOF) { scanf("%d",&col); getchar(); scanf("%c%d",&end,&ed); getchar(); start.x = row-'a'+1; start.y = col; finish.x = end-'a'+1; finish.y = ed; if(start.x==finish.x&&start.y==finish.y) min = 0; else min = bfs(); printf("To get from %c%d to %c%d takes %d knight moves.\n",row,col,end,ed,min); } return 0; }