zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [Swift]LeetCode71. 简化路径 | Simplify Path
    [Swift]LeetCode68. 文本左右对齐 | Text Justification
    武汉亿童笔试面试心得体会
    武汉亿童笔试面试心得体会
    武汉一起好面试心得体会
    武汉一起好面试心得体会
    武汉财富基石笔试面试心得体会
    武汉财富基石笔试面试心得体会
    武汉游记,三天找工作之旅终于结束了
    武汉游记,三天找工作之旅终于结束了
  • 原文地址:https://www.cnblogs.com/Skyxj/p/3182818.html
Copyright © 2011-2022 走看看