题目大意是在一个网格中(行编号从1~8,列编号从a~h),给你两个点,要你找出象棋中的马从一个点跳到另一个点的最少步数。是一道十分基础的bfs(宽度优先搜索)。
#include<iostream> #include<cstdio> #include<string> #include<queue> using namespace std; struct Point { int x,y,step; bool operator == (const Point &b) { if(x==b.x&&y==b.y) return 1; else return 0; } }; int bfs(Point a,Point b) { queue<Point> q; if(a==b) return 0; q.push(a); while(!q.empty()) { Point cur=q.front(); q.pop(); if(cur==b) return cur.step; int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};//马跳跃的八个方向 for(int i=0;i<8;i++) { Point next; next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; next.step=cur.step+1; if(next.x<1||next.x>8||next.y<1||next.y>8) continue;//判断越界 q.push(next); } } return -1;//马一定可以跳到终点,所以这只是一个形式 } int main() { string str1,str2; Point a,b; while(cin>>str1>>str2) { a.y=str1[0]-'a'+1;//先把字母转换成数字 a.x=str1[1]-'0'; a.step=0; b.y=str2[0]-'a'+1; b.x=str2[1]-'0'; int ans=bfs(a,b); cout<<"To get from "<<str1<<" to "<<str2<<" takes "<<ans<<" knight moves."<<endl; } return 0; }