• SWJTU 2184迷宫


    DongGua: Save our SWJTU!

    Time Limit:2000MS  Memory Limit:65536K
    Total Submit:46 Accepted:22

    Description

    One night ,Desgard_Duan was caught by an alien named “DG”when he was sleeping soundly.
    “Now,you are in a extremely complicated maze, if you can’t escape from this maze,you will be trapped in it all your life!And I will destroy SWJTU OJ! hhhhhhhhhhhhhhh”
    “Why you choose me?!”
    “OK,shut up,now I will give you some prompts.This is a N rows and M columns maze ,and then your start point (X1,Y1),the end of maze (X2,Y2).For every location,i will give you a value which means the value of walls around it.”
    “What’s the value mean?”(mad)
    “Xiao Xiao Duan Donggua,so clever ya!
    If the location has a wall above it the variable has 8 added to it.
    If the location has a wall to the left of it the variable has 4 added to it.
    If the location has a wall below it the variable has 2 added to it.
    If the location has a wall to the right of it the variable has 1 added to it.”
    But,as you know ,Duan Donggua’s ID is not so reliable.Can you help him?

    Input

    For each case, the first line of input contains two numbers: m and n (0 <= m, n <= 600).
    The second line contains two number X1, Y1. They are start point.
    As the second line, two number X2, Y2 are the end of maze. (0 <= X1, X2 < m, 0 <= Y1, Y2 < n)
    The following m lines include n numbers each. And this is the Matrix to describe the maze.

    Output

    Your program should output a text file with two lines:
    The first line should be the number of moves required to get from the start location to the end location.
    The second line should be a list of moves that will trace a path from the start position to the end position without going through any walls. Each move is represented by a single letter U, D, L or R for Up, Down, Left or Right respectively.

    Sample Input

    5 4
    2 2
    4 0
    14 9 12 9
    14 2 3 5
    13 12 8 3
    5 5 6 9
    6 2 11 7

    Sample Output

    4
    LDDL

    Hint

    Source

     

    水题,记录开始到终点移动每一步的方向

     

     1 #include "iostream"
     2 #include "string"
     3 #include "memory.h"
     4 #include "queue"
     5 #include "algorithm"
     6 #include "cstdio"
     7 using namespace std;
     8 #define MAXN 1111
     9 const char  dir[] = {'U','D','L','R'};
    10 const int dx[] = {-1,1,0,0},dy[] = {0,0,-1,1};
    11 int map[MAXN][MAXN];
    12 int vis[MAXN][MAXN];
    13 string wall[MAXN][MAXN];
    14 int n,m;
    15 int sx,sy,fx,fy;
    16 
    17 struct node {
    18     int x,y,time;
    19     string path;
    20 }now;
    21 
    22 
    23 void gao(int temp,int i,int j)
    24 {
    25     wall[i][j] = "";
    26     if (temp - 8 >= 0) temp -= 8, wall[i][j] += 'U';
    27     if (temp - 4 >= 0) temp -= 4, wall[i][j] += 'L';
    28     if (temp - 2 >= 0) temp -= 2, wall[i][j] += 'D';
    29     if (temp - 1 >= 0) temp -= 1, wall[i][j] += 'R';
    30 }
    31 
    32 bool judge(int x,int y)
    33 {
    34     if (x < 0 || y < 0 || x >= m || y >= n) return 1;
    35     if (vis[x][y]) return 1;
    36     return 0;
    37 }
    38 void bfs()
    39 {
    40     queue<node> q;
    41     now.x = sx;
    42     now.y = sy;
    43     now.path ="";
    44     now.time = 0;
    45     vis[sx][sy] = 1;
    46     q.push(now);
    47     while (!q.empty())
    48     {
    49         now = q.front();
    50         q.pop();
    51         if (now.x == fx && now.y == fy)
    52         {
    53             cout << now.time << endl;
    54             cout << now.path <<endl;
    55             return ;
    56         }
    57         int i;
    58         node next;
    59         for (i = 0;i < 4; ++ i)
    60         {
    61             if (wall[now.x][now.y].find(dir[i]) == -1) {
    62                 next.x = now.x + dx[i];
    63                 next.y = now.y + dy[i];
    64             } else continue;
    65             if (judge(next.x,next.y)) continue;
    66             next.path  = now.path + dir[i];
    67             next.time  = now.time + 1;
    68             vis[next.x][next.y] = 1;
    69             q.push(next);
    70         }
    71     }
    72 
    73 }
    74 int main()
    75 {
    76     int i, j;
    77     while ( cin >> m >> n ) {
    78         memset(vis,0,sizeof(vis));
    79         scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
    80         for (i = 0;i < m; ++ i)
    81             for (j = 0;j < n; ++ j) {
    82            scanf("%d",&map[i][j]);
    83             gao(map[i][j],i,j);
    84         }
    85         bfs();
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    算法描述》关于LIS的nlogn方法
    简单tarjan》一道裸题(BZOJ1051)(easy)
    值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)
    值得一做》关于一道DP+SPFA的题 BZOJ1003 (BZOJ第一页计划) (normal-)
    图论算法》关于最大流转最短路两三事
    刷题向》图论》BZOJ1001 平面图最大流、平面图最小割、单源最短路(easy+)
    c++中结构体的使用
    c++的标准流入流出和使用例子
    小知识 ——引用
    小知识——关于数组指针和指针数组
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4158542.html
Copyright © 2020-2023  润新知