读书人

HDU 1728 逃出迷宫 + HDU 1072 Nightm

发布时间: 2012-10-11 10:16:10 作者: rapoo

HDU 1728 逃离迷宫 + HDU 1072 Nightmare
KIDx 的解题报告
HDU 1728 逃离迷宫 http://acm.hdu.edu.cn/showproblem.php?pid=1728
对于代码31行,为什么等于不能随便剪掉
如果剪掉就会出现下图结果:
【假如转弯数k=1,起点终点如图】
那么如果你的代码是优先向右搜索就会出错
红色的线是先搜的,由于最多转一次弯,所以不合题意;
蓝色是后搜的,因为遇到转弯数相等所以不往下走了了,但是继续走是可以满足题意输出"yes"的


深搜:


#include <iostream>#include <queue>using namespace std;#define inf 0x3fffffff#define M 10int sx, sy, step[M][M], T[M][M], r, c;int x_move[4] = {-1, 0, 1, 0};int y_move[4] = {0, 1, 0, -1};int map[M][M];struct pos{    int x, y;};void bfs (){    int i, j;    for (i = 0; i < r; i++)        for (j = 0; j < c; j++)            step[i][j] = inf, T[i][j] = 0;    pos ft, tp;    ft.x = sx, ft.y = sy;    step[ft.x][ft.y] = 0;    T[ft.x][ft.y] = 6;    queue <pos> q;    q.push (ft);    while (!q.empty())    {        ft = q.front();        q.pop();        if (map[ft.x][ft.y] == 3 && T[ft.x][ft.y] > 0)        {            printf ("%d\n", step[ft.x][ft.y]);            return ;        }        for (i = 0; i < 4; i++)        {            tp.x = ft.x + x_move[i];            tp.y = ft.y + y_move[i];            if (tp.x < 0 || tp.y < 0 || tp.x >= r || tp.y >= c)                continue;            if (map[tp.x][tp.y] == 0)                continue;            if (step[tp.x][tp.y] <= step[ft.x][ft.y] + 1 &&             T[tp.x][tp.y] >= T[ft.x][ft.y] - 1)                continue;            step[tp.x][tp.y] = step[ft.x][ft.y] + 1;            T[tp.x][tp.y] = T[ft.x][ft.y] - 1;            if (T[tp.x][tp.y] <= 0)                continue;            if (map[tp.x][tp.y] == 4)                T[tp.x][tp.y] = 6;            q.push (tp);        }    }    puts ("-1");}int main(){    int t, i, j;    scanf ("%d", &t);    while (t--)    {        scanf ("%d%d", &r, &c);        for (i = 0; i < r; i++)        {            for (j = 0; j < c; j++)            {                scanf ("%d", map[i]+j);                if (map[i][j] == 2)                    sx = i, sy = j;            }        }        bfs ();    }    return 0;}

读书人网 >编程

热点推荐