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;
}


posted on 2012-11-29 10:13  Primo...  阅读(120)  评论(0)    收藏  举报