跳马问题,从一个位置跳到另一个位置最少需要几步?我用的BFS,94MS,不知道那些牛人的0MS是怎么做到的!说明我的代码还可以优化,希望路过的高手指点下啊!
我的代码:
#include<iostream> #include<cstring> #include<queue> using namespace std; struct pos { int x,y,step; }; pos start,end; bool board[8][8];//棋盘 int d[8][2]={{1,2},{-1,2},{2,1},{-2,1},{1,-2},{-1,-2},{2,-1},{-2,-1}};//马的八个方向 int bfs(pos s,pos e); int main() { char a[3],b[3]; while(cin>>a>>b) { start.x = a[0]-'a';//将输入转化为棋盘中的位置 start.y = a[1]-'1'; end.x = b[0]-'a'; end.y = b[1]-'1'; start.step = 0;//初始化步数为0 memset(board,false,sizeof(board));//false表示没有走过 cout<<"To get from "<<a<<" to "<<b<<" takes "<<bfs(start,end)<<" knight moves."<<endl; } return 0; } int bfs(pos s,pos e) { queue<pos> que; pos p; int i,dx,dy; while(1) { if(s.x == e.x && s.y == e.y) return s.step; for(i = 0 ; i < 8 ; ++i) { dx = s.x + d[i][0]; dy = s.y + d[i][1]; if(dx < 0 || dx >= 8 || dy < 0 || dy >= 8 )//越界判断 continue; if( !board[dx][dy])//可以走 { p.x = dx; p.y = dy; board[dx][dy] = true;//走过后标记 p.step = s.step + 1; que.push(p);//结点入队列 } } s = que.front();//取队首元素,继续广搜 que.pop();//并且出队列 } }