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

  • 相关阅读:
    CocoaPod 常用命令
    Runloop
    RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy
    RxSwift学习笔记6:Subjects/PublishSubject/BehaviorSubject/ReplaySubject/Variable
    RxSwift学习笔记5:Binder
    RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder
    RxSwift学习笔记3:生命周期/订阅
    RxSwift学习笔记2:Observable/生命周期/Event/oneNext/onError/onCompleted/
    RxSwift学习笔记1:RxSwift的编程风格
    iOS处理视图上同时添加单击与双击手势的冲突问题
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10744708.html
Copyright © 2011-2022 走看看