码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1915 Knight Moves

时间:2016-08-07 21:52:56      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

问题链接:POJ1915 Knight Moves

题意简述:输入测试用例数量,输入棋盘大小,输入国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。

问题分析:典型的BFS问题。在BFS搜索过程中,马跳过的点就不必再跳了,因为这次再跳下去不可能比上次步数少。

程序中,使用了一个队列来存放中间节点,但是每次用完需要清空。

技术分享

AC的C++语言程序如下:

/* POJ1915 Knight Moves */

#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

#define MAXN 300

#define DIRECTSIZE 8

struct direct {
    int drow;
    int dcol;
} direct[DIRECTSIZE] =
    {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};

char grid[MAXN][MAXN];

int n, l;
int startcol, startrow, endcol, endrow;
int ans;

struct node {
    int row;
    int col;
    int level;
};

queue<node> q;

void bfs()
{
    while(!q.empty())
        q.pop();

    memset(grid, 0, sizeof(grid));

    grid[startrow][startcol] = 1;

    ans = 0;
    node start;
    start.row = startrow;
    start.col = startcol;
    start.level = 0;
    q.push(start);

    while(!q.empty()) {
        node front = q.front();
        q.pop();

        if(front.row == endrow && front.col == endcol) {
            ans = front.level;
            break;
        }

        for(int i=0; i<DIRECTSIZE; i++) {
            int nextrow = front.row + direct[i].drow;
            int nextcol = front.col + direct[i].dcol;

            if(0 <= nextrow && nextrow < l && 0 <= nextcol && nextcol < l)
                if(grid[nextrow][nextcol] == 0) {
                    grid[nextrow][nextcol] = 1;

                    node v;
                    v.row = nextrow;
                    v.col = nextcol;
                    v.level = front.level + 1;
                    q.push(v);
                }
        }
    }
}

int main(void)
{
    scanf("%d", &n);
    while(n--) {
        scanf("%d%d%d%d%d", &l, &startrow, &startcol, &endrow, &endcol);

        bfs();

        printf("%d\n", ans);
    }

    return 0;
}


POJ1915 Knight Moves

标签:

原文地址:http://blog.csdn.net/tigerisland45/article/details/52136710

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!