andre_joy

导航

hdu 1372

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1372

题意:按照国际象棋规则马最少几步从开始点走到终点。

mark:bfs,仔细。

代码:

#include <stdio.h>
#include <string.h>

int a[100][2],d[8][8];
char p[5],q[5];

void bfs()
{
    int front = 0,rear = 1,m,n;
    d[p[0]-'a'][p[1]-'0'-1] = 0;
    a[0][0] = p[0]-'a';
    a[0][1] = p[1]-'0'-1;
    while(front != rear)
    {
        m = a[front][0];
        n = a[front++][1];
        if(m == q[0]-'a' && n == q[1]-'0'-1) return ;
        if(m > 1 && n > 0 && !d[m-2][n-1]) a[rear][0] = m-2, a[rear++][1] = n-1, d[m-2][n-1] = d[m][n]+1;
        if(m > 0 && n > 1 && !d[m-1][n-2]) a[rear][0] = m-1, a[rear++][1] = n-2, d[m-1][n-2] = d[m][n]+1;
        if(m > 1 && n < 7 && !d[m-2][n+1]) a[rear][0] = m-2, a[rear++][1] = n+1, d[m-2][n+1] = d[m][n]+1;
        if(m > 0 && n < 6 && !d[m-1][n+2]) a[rear][0] = m-1, a[rear++][1] = n+2, d[m-1][n+2] = d[m][n]+1;
        if(m < 7 && n > 1 && !d[m+1][n-2]) a[rear][0] = m+1, a[rear++][1] = n-2, d[m+1][n-2] = d[m][n]+1;
        if(m < 6 && n > 0 && !d[m+2][n-1]) a[rear][0] = m+2, a[rear++][1] = n-1, d[m+2][n-1] = d[m][n]+1;
        if(m < 7 && n < 6 && !d[m+1][n+2]) a[rear][0] = m+1, a[rear++][1] = n+2, d[m+1][n+2] = d[m][n]+1;
        if(m < 6 && n < 7 && !d[m+2][n+1]) a[rear][0] = m+2, a[rear++][1] = n+1, d[m+2][n+1] = d[m][n]+1;
    }
}

int main()
{
//    freopen("in.txt", "r", stdin);
    while(~scanf("%s %s", p, q))
    {
        memset(d, 0, sizeof(d));
        bfs();
        printf("To get from %s to %s takes %d knight moves.\n", p, q, d[q[0]-'a'][q[1]-'0'-1]);
    }
    return 0;
}

posted on 2012-07-12 22:40  andre_joy  阅读(274)  评论(0编辑  收藏  举报