1. 迷宫寻宝(maze.cpp)
【问题描述】
在一个二维世界里,爬爬虫今天准备去寻宝。现在一个 n*n (n 行, n 列)的迷宫,存
在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只
能走到与它直接相邻的其他四个位置(上、下、左、右)。现爬爬虫在迷宫的入口处(1,1),
问它最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。
【输入格式】输入文件名为 maze.in。
第 1 行 1 个正整数 n,表示迷宫的大小。
接下来的 n*n 数据,数字 0 表示联通,数字 1 表示墙壁,数字 2 表示宝藏位置(数据保证
宝藏位置不在起点);
【输出格式】输出文件名为 maze.out。
输出一个整数,即最少步数,如果拿不到宝藏,则输出-1;
【输入输出样例 1】
maze.in
5
0 0 1 0 1
0 1 2 1 1
0 0 0 0 1
1 0 0 0 0
1 1 0 0 1
maze.out
5
【输入输出样例 2】
maze.in
4
0 0 0 1
1 1 0 1
0 0 1 0
2 0 1 0
maze.out
-1
【数据说明】
对于 40% 的数据,1<=n<=10;
对于 100% 的数据,1<=n<=1000;
代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,step;
}head;
int maze[110][110],n,m,x,y;
queue<node>q;
int Next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool f=0;
void init()
{
cin>>n;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
cin>>maze[i][j];
}
void bfs()
{
q.push(node{1,1,0});
maze[1][1]=1;
while (!q.empty())
{
for (int i=0;i<4;++i)
{
x=q.front().x+Next[i][0];y=q.front().y+Next[i][1];
if ((x<=n)&&(x>=1)&&(y<=n)&&(y>=1)&&maze[x][y]==0)
{
node tail;
tail.x=x;tail.y=y;tail.step=q.front().step+1;
q.push(tail);
maze[x][y]=1;
if (maze[x][y]==2)
{
f=1;
cout<<tail.step;
break ;
}
}
}
q.pop();
}
}
int main()
{
init();
bfs();
if (f==0) cout<<"-1"<<endl;
return 0;
}
运行结果一直都是“-1”