18714 迷宫问题
时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: G++;GCC
Description
迷宫是一个n*m的矩阵,玩家需要迷宫入口(坐标1,1)出发,寻找路径走到出口(n,m)。 请判断玩家能否从迷宫中走出。
输入格式
第一行两个整数n和m,代表n行m列。(1<=n,m<=10) 下面n行每行m个字符,0代表可以通行,1代表不可以通行。
输出格式
如果能从迷宫走出,输出yes,否则输出no。
输入样例
8 8 00100010 00100010 00001100 01110000 00010000 01000100 01110110 00001000
输出样例
yes
问题分析:
本题为基础版迷宫问题,以下为广度优先算法尝试。
可在每个位置检查四个方向,使用队列存储未搜索过且不为墙的位置,每次循环取出一个待搜索位置,检查下一组“四个方向的位置”。
代码实现:
#include<iostream>
#include<queue>
using namespace std;
struct gezi
{
int x;
int y;
};
int main()
{
int m,n;
char map[15][15];
queue<gezi> daisou;
/**< 用于移动 */
int xmove[4]={1,0,-1,0};
int ymove[4]={0,1,0,-1};
/**< 初始化迷宫(0行0列设置为墙) */
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
map[i][j]='1';
}
}
/**< 读入迷宫 */
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
/**< 设置起点终点 */
gezi start,end;
start.x=1;
start.y=1;
end.x=m;
end.y=n;
daisou.push(start);//最初从起点开始搜索
while(!daisou.empty())
{
gezi now=daisou.front();//取队首进行检查
map[now.x][now.y]='1';//标记已搜索位置(与墙一致)
daisou.pop();
gezi next;
for(int i=0;i<4;i++)
{
next.x=now.x+xmove[i];//朝四个方向移动
next.y=now.y+ymove[i];
if(map[next.x][next.y]=='0')
{
if(next.x==end.x&&next.y==end.y)//可到达终点
{
cout<<"yes"<<endl;
return 0;
}
else//未发现终点,继续寻找可以走的路径
{
daisou.push(next);
}
}
}
}
cout<<"no"<<endl;
return 0;
}