题一:
下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共10 步。其中D、U、L、R 分别表示向下、向上、向左、向右走。
对于下面这个更复杂的迷宫(30 行50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
请注意在字典序中D<L<R<U。
解释:
1:“请找出字典序最小的一个作为答案“,字典顺序是D<L<R<U,注意审题,字典顺序最少,就按照D>L>R>U的顺序来走迷宫。
2:可以用BFS和DFS;
3:BFS只适用于相邻结点距离为1的情况
知识点:
队列(C++):
1:基本操作:
-push(x) 将x压入队列的末端
- pop() 删除队列的第一个元素(队顶元素),注意此函数并不返回任何值
- front() 返回第一个元素(队顶元素)
- back() 返回最后被压入的元素(队尾元素)
- empty() 当队列为空时,返回true
- size() 返回队列的长度
2:头文件:
#include <queue>
声明:queue<数据类型>队列名字
代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int x;
int y;
string p;
};
char a[31][51]; //地图
char k[4]={'D','L','R','U'};
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}}; //数组dir和K是相对应的
//进行四行二列的赋值,第一行1,0;第二行0,-1
int vis[30][50];
void bfs(){
node start;start.x=0;start.y=0;start.p="";
vis[0][0]=1;
queue<node>q; q.push(start);
while(!q.empty()){
node now=q.front(); //访问队首元素
//cout<<now.p<<endl;
//cout<<now.x<<endl;
q.pop(); //出队,注意,不返回队首元素
if(now.x==29 && now.y==49){
cout<<now.p<<endl;
return; //退出
}
for(int i=0;i<4;i++){
node next;
//cout<<now.p<<endl;
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
if(next.x<0 || next.x>=30 || next.y<0 || next.y>50)
{
continue; //越界
}
if(vis[next.x][next.y]==1||a[next.x][next.y]=='1'){
continue; //是否被访问
}
vis[next.x][next.y]=1;
next.p=now.p+k[i]; //添加路径,路径进行叠加
q.push(next); //入队
}
}
}
int main(){
for(int i=0;i<30;i++){
cin>>a[i];
}
bfs();
}