c++ 迷宮搜索(寬搜)
題目描述
迷宮的游戲,相信大家都聽過,現在我們用一個n*m的矩陣表示一個迷宮,例如:
S.X.
..X.
..XD
....
其中‘S’表示起點,‘D’表示終點,‘X’表示該位置為牆,不可以走,‘.’表示可以通行。每次只能向“上下左右”四個方向移動一步。
你的任務是判斷在x步內(小於等於x),能否從起點走到終點。
輸入
第一行輸入三個數n m x,分別表示迷宮的尺寸和步數。(1 < n,m < 7; 0 < x < 50)
接下來輸入一個n*m的矩陣,描述迷宮的狀態。
輸出
判斷是否能在x步內從起點走到終點,如果可以,輸出“YES”,否則輸出“NO”。
樣例輸入
3 4 5
S.X.
..X.
...D
樣例輸出
YES
廢話不多說,直接上代碼
AC代碼
#include <bits/stdc++.h>
using namespace std;
int n,m,z,f,e;//e是入隊的下標 f 是出隊的下標
struct point {//結構體
int x,y,step;
};
int dx[4]= {1,-1,0,0};//dx[] + dy[] 代表小人走的4個方向可達的點
int dy[4]= {0,0,-1,1};
point q[100],s,t;//q是隊列 s是起點 t是終點
char g[10][10];//整個隊列 (迷宮)即二位數組
bool used[10][10];
int main()
{
scanf("%d %d %d",&n,&m,&z);//輸入
for(int i=0; i<=n-1; i++) {//輸入
scanf("%s",g[i]);//scanf
for(int j=0; j<=m-1; j++) {//獲取起點和終點的 x 和 y 坐標
if(g[i][j] == 'S') {
s.x=i,s.y=j,s.step=0;
} else if(g[i][j]=='D')
t.x=i,t.y=j;
}
}
memset(used ,0,sizeof(used)); //memset
q[1]=s,f=1,e=1,used[s.x][s.y]=1;// 把起點入隊
////////////////////////////////Strat to BFS///////////////////////////////////////////
while(f<=e) {//保證不越界
point u=q[f++];//選定的元素
for(int i=0; i<4; i++) {
point v;
v.x=u.x+dx[i],v.y=u.y+dy[i],v.step=u.step+1;
if(v.x<0||v.x>=n||v.y<0||v.y>m)continue;//如果出了迷宮
if(used[v.x][v.y]==1)continue;//如果已經走過
if(v.step>z)continue;//如果 步數超過規定
if(g[v.x][v.y]=='X')continue;//如果撞牆
if(v.x==t.x&&v.y==t.y) {//如果找到出口
cout << v.step << endl;//直接輸出在退出
cout<<"YES"<<endl;
return 0;
}
e++;//直接入隊
q[e]=v;
used[v.x][v.y]=1;
}
}
cout<<"NO"<<endl;
return 0;
}
bfs思路總結:
step1:先找出所有符合規則的數,通過走迷宮的規則和不能穿牆,不能超過迷宮邊界,不能超過5步來過濾
step2:將有效的數入隊,入隊的同時進行比較是否達到終點
step3:達到終點就輸出yes