c++ 迷宮搜索(寬搜)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM