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;
}
浙公网安备 33010602011771号