HDUOJ 1728逃离迷宫dp剪枝

#include <iostream>
using namespace std;
#define inf 0x3fffffff
#define M 105
//1、wan用于转弯数剪枝;2、step用于步数剪枝,就不用vis标记访问了
int r, c, ex, ey, k, wan[M][M];
char mapp[M][M];
int x_move[4] = {-1, 0, 1, 0};
int y_move[4] = {0, 1, 0, -1};
bool flag;
int times=0;
/*
void showmap(int x,int y)//用这个可以打印出来研究
{
 int i,j;
 printf("**************%d**************** ",times);
 for (i = 0; i < r; i++)
 {
   for (j = 0; j < c; j++)
   printf("%c",i==x&j==y?'@':mapp[i][j]);
   printf(" ");
 }
 printf("当前位置x=%d,y=%d ",x+1,y+1);
 for (i = 0; i < r; i++)
 {
   for (j = 0; j < c; j++)
   if(wan[i][j]==inf)
   printf("N");
   else
   printf("%d",wan[i][j]);
   printf(" ");
 }
  times++;
} */
void dfs (int x, int y, int dir) //dir为当前方向
{
    if (x == ex && y == ey)
    {
        if (wan[x][y] <= k)
            flag = true;
        return ;
    }
    //x !=ex && y != ey 说明必须至少再转一次弯,但是已经不能再转了
    if (x !=ex && y != ey && wan[x][y] == k)
        return ;
    if (wan[x][y] > k) //转弯数超过k不用往下走了
        return ;
    for (int i = 0; i < 4; i++)
    {
        int tx = x + x_move[i];
        int ty = y + y_move[i];
      //  showmap(tx,ty);
        if (tx < 0 || tx >= r || ty < 0 || ty >= c)
            continue;
  //转弯数相等不可剪掉,所以是wan[tx][ty] < wan[x][y]而不是wan[tx][ty] <= wan[x][y]
        if (mapp[tx][ty] == '*' || wan[tx][ty] < wan[x][y])
            continue;
        if (dir != -1 && i != dir && wan[tx][ty] < wan[x][y] + 1)
  /*如果下一步不是初始位置而且下一步要转弯而且下一步的转弯数还更小那就不走这步,同时避免了走回头路*/
            continue;
        wan[tx][ty] = wan[x][y];
        if (dir != -1 && i != dir)
            wan[tx][ty]++; //如果方向变了转弯+1
        dfs (tx, ty, i);
        if (flag)
            return ;
    }
}

int main()
{//freopen("C:\Users\Sky\Desktop\1.in","r",stdin);
//freopen("C:\Users\Sky\Desktop\1.out","w",stdout);
    int t, i, j, sx, sy; //sx, sy是起点
    scanf ("%d", &t);
    while (t--)
    {
        scanf ("%d%d", &r, &c);
        for (i = 0; i < r; i++)
            scanf ("%s", mapp[i]);
        scanf ("%d%d%d%d%d", &k, &sy, &sx, &ey, &ex);
        sx--, sy--, ex--, ey--;  //我从0开始编号,而题目是从1开始
        for (i = 0; i < r; i++)
            for (j = 0; j < c; j++)
                wan[i][j] = inf; //初始化转弯数和步数为无穷大
   wan[sx][sy] = 0; //到达起点的转弯数
   flag = false;
   dfs (sx, sy, -1); //一开始可以走任意方向,所以设方向为-1
   if (flag)
    puts ("yes");
   else puts ("no");
    }
    return 0;
}

打印结果

**************0****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=1
0NNNN
NNNNN
NNNNN
NNNNN
NNNNN
**************1****************
.@.**
*.**.
.....
.....
*....
当前位置x=1,y=2
0NNNN
NNNNN
NNNNN
NNNNN
NNNNN
**************2****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=2
00NNN
NNNNN
NNNNN
NNNNN
NNNNN
**************3****************
..@**
*.**.
.....
.....
*....
当前位置x=1,y=3
00NNN
NNNNN
NNNNN
NNNNN
NNNNN
**************4****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=3
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************5****************
...@*
*.**.
.....
.....
*....
当前位置x=1,y=4
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************6****************
...**
*.@*.
.....
.....
*....
当前位置x=2,y=3
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************7****************
.@.**
*.**.
.....
.....
*....
当前位置x=1,y=2
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************8****************
...**
*@**.
.....
.....
*....
当前位置x=2,y=2
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************9****************
@..**
*.**.
.....
.....
*....
当前位置x=1,y=1
000NN
N1NNN
NNNNN
NNNNN
NNNNN
**************10****************
...**
@.**.
.....
.....
*....
当前位置x=2,y=1
000NN
N1NNN
NNNNN
NNNNN
NNNNN
**************11****************
...**
*.**.
.....
.....
*....
当前位置x=1,y=0
000NN
N1NNN
NNNNN
NNNNN
NNNNN
no
**************12****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=1
0NNNN
NNNNN
NNNNN
NNNNN
NNNNN
**************13****************
.@.**
*.**.
.....
.....
*....
当前位置x=1,y=2
0NNNN
NNNNN
NNNNN
NNNNN
NNNNN
**************14****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=2
00NNN
NNNNN
NNNNN
NNNNN
NNNNN
**************15****************
..@**
*.**.
.....
.....
*....
当前位置x=1,y=3
00NNN
NNNNN
NNNNN
NNNNN
NNNNN
**************16****************
...**
*.**.
.....
.....
*....
当前位置x=0,y=3
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************17****************
...@*
*.**.
.....
.....
*....
当前位置x=1,y=4
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************18****************
...**
*.@*.
.....
.....
*....
当前位置x=2,y=3
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************19****************
.@.**
*.**.
.....
.....
*....
当前位置x=1,y=2
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************20****************
...**
*@**.
.....
.....
*....
当前位置x=2,y=2
000NN
NNNNN
NNNNN
NNNNN
NNNNN
**************21****************
.@.**
*.**.
.....
.....
*....
当前位置x=1,y=2
000NN
N1NNN
NNNNN
NNNNN
NNNNN
**************22****************
...**
*.@*.
.....
.....
*....
当前位置x=2,y=3
000NN
N1NNN
NNNNN
NNNNN
NNNNN
**************23****************
...**
*.**.
.@...
.....
*....
当前位置x=3,y=2
000NN
N1NNN
NNNNN
NNNNN
NNNNN
**************24****************
...**
*@**.
.....
.....
*....
当前位置x=2,y=2
000NN
N1NNN
N1NNN
NNNNN
NNNNN
**************25****************
...**
*.**.
..@..
.....
*....
当前位置x=3,y=3
000NN
N1NNN
N1NNN
NNNNN
NNNNN
**************26****************
...**
*.@*.
.....
.....
*....
当前位置x=2,y=3
000NN
N1NNN
N12NN
NNNNN
NNNNN
**************27****************
...**
*.**.
...@.
.....
*....
当前位置x=3,y=4
000NN
N1NNN
N12NN
NNNNN
NNNNN
**************28****************
...**
*.*@.
.....
.....
*....
当前位置x=2,y=4
000NN
N1NNN
N122N
NNNNN
NNNNN
**************29****************
...**
*.**.
....@
.....
*....
当前位置x=3,y=5
000NN
N1NNN
N122N
NNNNN
NNNNN
**************30****************
...**
*.**@
.....
.....
*....
当前位置x=2,y=5
000NN
N1NNN
N1222
NNNNN
NNNNN
**************31****************
...**
*.**.
.....
.....
*....
当前位置x=3,y=6
000NN
N1NN3
N1222
NNNNN
NNNNN
**************32****************
...**
*.**.
.....
....@
*....
当前位置x=4,y=5
000NN
N1NN3
N1222
NNNNN
NNNNN
**************33****************
...**
*.**.
...@.
.....
*....
当前位置x=3,y=4
000NN
N1NN3
N1222
NNNN3
NNNNN
**************34****************
...**
*.**.
.....
...@.
*....
当前位置x=4,y=4
000NN
N1NN3
N1222
NNNN3
NNNNN
**************35****************
...**
*.**.
..@..
.....
*....
当前位置x=3,y=3
000NN
N1NN3
N1222
NNN33
NNNNN
**************36****************
...**
*.**.
.....
..@..
*....
当前位置x=4,y=3
000NN
N1NN3
N1222
NNN33
NNNNN
**************37****************
...**
*.**.
.@...
.....
*....
当前位置x=3,y=2
000NN
N1NN3
N1222
NN333
NNNNN
**************38****************
...**
*.**.
.....
.@...
*....
当前位置x=4,y=2
000NN
N1NN3
N1222
NN333
NNNNN
**************39****************
...**
*.**.
.@...
.....
*....
当前位置x=3,y=2
000NN
N1NN3
N1222
N1333
NNNNN
**************40****************
...**
*.**.
.....
..@..
*....
当前位置x=4,y=3
000NN
N1NN3
N1222
N1333
NNNNN
**************41****************
...**
*.**.
.....
.....
*@...
当前位置x=5,y=2
000NN
N1NN3
N1222
N1233
NNNNN
**************42****************
...**
*.**.
.....
.@...
*....
当前位置x=4,y=2
000NN
N1NN3
N1222
N1233
N1NNN
**************43****************
...**
*.**.
.....
.....
*.@..
当前位置x=5,y=3
000NN
N1NN3
N1222
N1233
N1NNN
**************44****************
...**
*.**.
.....
.....
*....
当前位置x=6,y=2
000NN
N1NN3
N1222
N1233
N12NN
**************45****************
...**
*.**.
.....
.....
@....
当前位置x=5,y=1
000NN
N1NN3
N1222
N1233
N12NN
**************46****************
...**
*.**.
.....
@....
*....
当前位置x=4,y=1
000NN
N1NN3
N1222
N1233
N12NN
**************47****************
...**
*.**.
@....
.....
*....
当前位置x=3,y=1
000NN
N1NN3
N1222
21233
N12NN
**************48****************
...**
*.**.
.....
.@...
*....
当前位置x=4,y=2
000NN
N1NN3
31222
21233
N12NN
**************49****************
...**
*.**.
.....
.....
@....
当前位置x=5,y=1
000NN
N1NN3
31222
21233
N12NN
**************50****************
...**
*.**.
.....
.....
*....
当前位置x=4,y=0
000NN
N1NN3
31222
21233
N12NN
**************51****************
...**
*.**.
@....
.....
*....
当前位置x=3,y=1
000NN
N1NN3
31222
21233
N12NN
yes

原文地址:https://www.cnblogs.com/Skyxj/p/3182818.html