设为首页 收藏本站
查看: 890|回复: 0

[经验分享] 华为2017机试模拟 迷宫问题

[复制链接]

尚未签到

发表于 2017-7-10 18:15:50 | 显示全部楼层 |阅读模式
  题目:

题目描述:  sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。

输入:  输入有多组数据。
每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。

输出:  对每组输入输出该迷宫的最短步数,若不能到达则输出-1。

样例输入:
2
0 1
0 0
5
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
0 1 1 1 0
1 0 1 0 0
样例输出:
2
8
  思路:
  解决迷宫类似问题,如果是能不能到达,一般选用的是dfs,如果是求最短步数,一般选用的是bfs。
基本思路:

  本题要求的是最短步数,所以可以选用bfs。
       1、输入数据存储至结构体;
       2、从开始节点开始依次访问,发现到出口了,就return,否则继续,直到循环结束。
       3、比较打印结果。

  代码:



1 #include <vector>
2 #include <queue>
3 #include <iostream>
4 #include <algorithm>
5 using namespace std;
6
7
8
9 int mat[100][100];
10 int flag[100][100];
11 int stepArr[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };
12
13 struct Node
14 {
15     int x;
16     int y;
17     int step;
18     Node(int x1, int y1, int s1) :x(x1), y(y1), step(s1) {}
19 };
20
21 int bfs(int n)
22 {
23     Node node(0, 0, 0);
24     queue<Node> que;
25     que.push(node);
26     while (!que.empty())
27     {
28         node = que.front();
29         que.pop();
30         if (node.x == n - 1 && node.y == n - 1)
31             return node.step;
32         flag[node.x][node.y] == 1;
33         for (int i = 0; i < 4; ++i)
34         {
35             int x = node.x + stepArr[0];
36             int y = node.y + stepArr[1];
37             if (x >= 0 && y >= 0 && x < n && y < n
38                 && flag[x][y] == 0 && mat[x][y] == 0)
39             {
40                 flag[x][y] = 1;
41                 Node next(x, y, node.step + 1);
42                 que.push(next);
43             }
44         }
45     }
46     return -1;
47 }
48
49 int main()
50 {
51     int n;
52     while (cin >> n)
53     {
54         for(int i = 0; i < n; ++i)
55             for (int j = 0; j < n; ++j)
56             {
57                 cin >> mat[j];
58                 flag[j] = 0;
59             }
60         int depth = 0;
61         cout << bfs(n) << endl;
62     }
63 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392483-1-1.html 上篇帖子: [华为]单词倒排 下篇帖子: 华为RH 5885 v3 安装windows server 2008 R2推荐步骤(自我总结)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表