-
题目地址: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。
-
样例输入:
-
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、比较打印结果。
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
****************************************************************/