【九度】题目1335:闯迷宫(40分)
来源:互联网 发布:java写数据到txt 编辑:程序博客网 时间:2024/05/02 02:48
- 题目地址:http://ac.jobdu.com/problem.php?pid=1335
题目描述: sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。
- 输入:
输入有多组数据。
每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。
- 输出:
对每组输入输出该迷宫的最短步数,若不能到达则输出-1。
- 样例输入:
20 10 050 0 0 0 01 0 1 0 10 0 0 0 00 1 1 1 01 0 1 0 0
- 样例输出:
28
题目分析:
解决迷宫类似问题,如果是能不能到达,一般选用的是dfs,如果是求最短步数,一般选用的是bfs。
基本思路:
本题要求的是最短步数,所以可以选用bfs。
1、输入数据存储至结构体;
2、从开始节点开始依次访问,发现到出口了,就return,否则继续,直到循环结束。
3、比较打印结果。
C++ AC代码 Java超时。
#include <stdio.h>#include <stdlib.h>#include<queue>using namespace std;const int maxn = 102;int visit[maxn][maxn];int mazeArr[maxn][maxn];int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};int n; struct Node{ int x; int y; int step; Node(int x1,int y1,int step1):x(x1),y(y1),step(step1){}}; int bfs() { Node node(0,0,0); queue<Node> q ; while(!q.empty()) q.pop(); q.push(node); while (!q.empty()) { node = q.front(); q.pop(); if (node.x == n-1 && node.y == n-1) { return node.step; } visit[node.x][node.y] = 1; for (int i = 0; i < 4; i++) { int x = node.x + stepArr[i][0]; int y = node.y + stepArr[i][1]; if (x >= 0 && y >= 0 && x < n && y < n && visit[x][y] == 0 && mazeArr[x][y] == 0) { visit[x][y] = 1; Node next(x, y, node.step+1); q.push(next); } } } return -1;}int main(){ while(scanf("%d",&n) != EOF ){ if(n == 0){ break; } for(int i = 0; i < n ; i++){ for(int j = 0 ; j < n ; j++){ scanf("%d",&mazeArr[i][j]); visit[i][j] = 0; } } if (mazeArr[0][0] == 1 || mazeArr[n - 1][n - 1] == 1) { printf("%d\n",-1); continue; } printf("%d\n",bfs()); } return 0;}/************************************************************** Problem: 1335 User: wangzhenqing Language: C++ Result: Accepted Time:100 ms Memory:1136 kb****************************************************************/
- 【九度】题目1335:闯迷宫(40分)
- 九度 题目1335:闯迷宫(40分)
- 题目1335:闯迷宫(40分)
- 九度oj 题目1335:闯迷宫
- 题目1335:闯迷宫
- 九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲
- 九度OJ 1335:闯迷宫 (BFS)
- 题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)
- 1335闯迷宫
- (简单) 闯迷宫 (CD1775)
- 闯迷宫
- 九度 题目1341:艾薇儿的演唱会(40分)
- 九度 题目1333:考研海报(25分)
- 九度 题目1339:ACM(25分)
- 九度 题目1550:分糖果
- 九度 oj 题目1550:分糖果
- 【华为练习题】 闯迷宫(高级)
- 九度oj 题目1546:迷宫问题 (概率dp guess消元)
- Django Admin外键选择的自动完成
- 跨平台C++开发
- java中的值传递和引用传递
- functional programming 第0周
- 三极管做开关,常用到的电容作用(旁路-输入,去耦-输出、电源,运放中的补偿电容)
- 【九度】题目1335:闯迷宫(40分)
- wikioi 1046 旅行家的预算
- 解决SQL Server2008中修改数据后无法保存问题
- ASP.NET页面事件顺序
- Big Number
- 杨辉三角的变形
- Android版百度地图MapView维护
- 哈希排序
- Oracle 索引 详解