UVA439- Knight Moves
此题卡住我的地方有:
一:理解题意,一开始压根看不懂题意,看了解释,才知道是马走日的搜索;
二:开始的时候用dfs水过的的,代码烂的不堪入目,所以,此处不再粘了,然后自己慢慢摸索了好久,才用bfs过的。
代码如下:
边遍历,边搜索;
#include <iostream> #include <cstring> using namespace std; int x, y, min_n; int node[100][3], vis[10][10]; int pan(int i, int j) { if(i>=1&&j>=1&&i<=8&&j<=8&&vis[i][j]==0)return 1; else return 0; } void bfs(int i, int j) { if(i == x&& j== y) return; node[0][0] = i; node[0][1] = j; node[0][2] = 0; int rear = 0, front = 0; vis[i][j] = 1; while(front>=rear) { int a = node[rear][0], b = node[rear][1], l = node[rear][2]; if(pan(a-2,b-1)){vis[a-2][b-1] = 1;if(a-2 == x&& b-1== y){ min_n = l+1; return;} front++;node[front][0]= a-2;node[front][1] = b-1;node[front][2] = l+1;} if(pan(a-2,b+1)){vis[a-2][b+1] = 1;if(a-2 == x&& b+1== y){ min_n = l+1; return;} front++;node[front][0]= a-2;node[front][1] = b+1;node[front][2] = l+1;} if(pan(a+2,b-1)){vis[a+2][b-1] = 1;if(a+2 == x&& b-1== y){ min_n = l+1; return;} front++;node[front][0]= a+2;node[front][1] = b-1;node[front][2] = l+1;} if(pan(a+2,b+1)){vis[a+2][b+1] = 1;if(a+2 == x&& b+1== y){ min_n = l+1; return;} front++;node[front][0]= a+2;node[front][1] = b+1;node[front][2] = l+1;} if(pan(a-1,b+2)){vis[a-1][b+2] = 1;if(a-1 == x&& b+2== y){ min_n = l+1; return;} front++;node[front][0]= a-1;node[front][1] = b+2;node[front][2] = l+1;} if(pan(a-1,b-2)){vis[a-1][b-2] = 1;if(a-1 == x&& b-2== y){ min_n = l+1; return;} front++;node[front][0]= a-1;node[front][1] = b-2;node[front][2] = l+1;} if(pan(a+1,b+2)){vis[a+1][b+2] = 1;if(a+1 == x&& b+2== y){ min_n = l+1; return;} front++;node[front][0]= a+1;node[front][1] = b+2;node[front][2] = l+1;} if(pan(a+1,b-2)){vis[a+1][b-2] = 1;if(a+1 == x&& b-2== y){ min_n = l+1; return;} front++;node[front][0]= a+1;node[front][1] = b-2;node[front][2] = l+1;} rear++; } } int main () { char col1, col2; int row1, row2; while(cin>>col1>>row1>>col2>>row2) { memset(node,0,sizeof(node)); memset(vis,0,sizeof(vis)); min_n = 0; x = row2; y = col2-'a'+1; bfs(row1,col1-'a'+1); cout<<"To get from "<<col1<<row1<<" to "<<col2<<row2<<" takes "<<min_n<<" knight moves."<<endl; } return 0; }