• 1255:迷宫问题


    题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1255

    1255:迷宫问题


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 2306     通过数: 1038 

    【题目描述】

    定义一个二维数组:

    int maze[5][5] = {
    0,1,0,0,0,
    0,1,0,1,0,
    0,0,0,0,0,
    0,1,1,1,0,
    0,0,0,1,0,
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

    【输入】

    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

    【输出】

    左上角到右下角的最短路径,格式如样例所示。

    【输入样例】

    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0

    【输出样例】

    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

    解析:
    这题是一个典型的迷宫型搜索题目,而且很简单,考查重点在于搜索时记录前驱节点并输出这一块。这部分我使用的是数组储存+递归输出路径。

    参考代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<string>
     7 #include<cstdlib>
     8 #include<queue>
     9 #include<vector>
    10 #define INF 0x3f3f3f3f
    11 #define PI acos(-1.0)
    12 #define N 10010
    13 #define MOD 2520
    14 #define E 1e-12
    15 using namespace std;
    16 bool vis[10][10];
    17 int a[10][10],pre[N];
    18 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    19 struct node{
    20     int x,y;
    21 }q[N];
    22 void print(int tail)//递归输出路径,由于我更习惯从1开始计数
    23 {                    //而题目是从0开始,所以。。。 
    24     if(pre[tail]!=tail) print(pre[tail]);
    25     cout<<"("<<    q[tail].x-1<<", "<<q[tail].y-1<<")"<<endl;
    26 }
    27 void bfs(int i,int j)
    28 {
    29     int head=0,tail=1;
    30     q[tail].x=i;q[tail].y=j;
    31     pre[tail]=tail;
    32     memset(vis,0,sizeof(vis));
    33     do
    34     {
    35         head++;
    36         for(int i=0;i<4;i++)
    37         {
    38             int nx=q[head].x+dir[i][0];
    39             int ny=q[head].y+dir[i][1];
    40             if(nx>0&&nx<=5&&ny>0&&ny<=5&&vis[nx][ny]==0&&a[nx][ny]!=1)
    41             {
    42                 tail++;
    43                 q[tail].x=nx;
    44                 q[tail].y=ny;
    45                 pre[tail]=head;
    46                 vis[nx][ny]=1;
    47             }
    48             if(nx==5&&ny==5){print(tail);return;}
    49         }
    50     }while(head<tail);
    51 }
    52 int main()
    53 {
    54     for(int i=1;i<=5;i++)
    55      for(int j=1;j<=5;j++)
    56          scanf("%d",&a[i][j]);
    57     if(a[5][5]==1) return 0;//剪枝(逃 
    58     bfs(1,1);
    59     return 0;
    60 } 

    2019-04-21 12:37:37

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10744708.html
Copyright © 2020-2023  润新知