[cpp] //題意:給定兩個點的坐標,按照國際象棋中騎士的走法(有點類似於中國象棋的馬踏斜日,可以向八個方向走),問最短的步子 //思路:典型搜索的題目,一般求最小的步子用BFS //調試注意:..... #include<iostream> #include<queue> #include<cstring> #define maxlen 9 using namespace std; int mat[maxlen][maxlen]; struct node { int x; int y; int step; }s,e; int dir[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}}; int BFS(node s,node e) { memset(mat,0,sizeof(mat));//每個點都可以走 queue<node> q; node ol,ne; while(!q.empty()) { q.pop(); } s.step=0; q.push(s); while(!q.empty()) { ol=q.front(); q.pop(); if(ol.x==e.x&&ol.y==e.y){return ol.step;} else { for(int i=0;i<8;i++) { ne.x=ol.x+dir[i][0]; ne.y=ol.y+dir[i][1]; ne.step=ol.step; if(mat[ne.x][ne.y]||ne.x<1||ne.x>8||ne.y<1||ne.y>8) continue ; else { mat[ne.x][ne.y]=1; ne.step++; q.push(ne); } } } } return ne.step; } int main() { char m,n; while(cin >> m >>s.y >> n >> e.y) { s.x=m-'a'+1; e.x=n-'a'+1; cout << "To get from " << m << s.y << " to " << n << e.y << " takes "<< BFS(s,e) << " knight moves."<<endl; } return 0; }