3090 走迷宮

行胜于言Ibl發表於2024-11-25
#include<iostream>
using namespace std;

//4個方向的陣列:上 右 下 左 
int dx[4]={-1,0,1,0} ,dy[4]={0,1,0,-1};
//建立地圖陣列 
char G[105][105]; 
//標記陣列,對應地圖陣列的每一個點,1代表被搜尋過 
int vis[105][105]; 
int f = 0;//標記結果,1代表兩個點之間有路線,0代表沒有
int sx,sy;//起點座標 
int ex,ey;//終點座標
int n;//一會用來接收地圖大小,n行n列 

//dfs()用來搜尋一個點的上下左右位置
//因此要傳入一個點的座標 
void dfs(int x,int y){
	if(x==ex && y==ey){//代表被搜尋到 
		f=1;//修改標記
		return;//結束搜尋 
	}
	//依次搜尋4個方向 :上下左右 
	for(int i=0;i<4;i++){
		//獲取下一次搜尋的位置
		int xx=x+dx[i];
		int yy=y+dy[i];
		//檢查新的座標是否在地圖內
		//這個點是否被搜尋過
		//這個點是否是障礙物 
		if(xx>=0&&yy>=0&&xx<n&&yy<n&&G[xx][yy]!='#'&&vis[xx][yy]==0){
			vis[xx][yy]=1;//修改標記,代表這個點被搜尋過
			dfs(xx,yy); 
		}
	} 
} 

int main() {
	cin>>n; //接收n,
	
	//接收地圖,n行n列 
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>G[i][j];
		}
	} 
	
	//接收起點和終點
	cin>>sx>>sy>>ex>>ey;
	
	//開啟搜尋
	//如果起點和終點是障礙物,不能開啟搜尋 
	if(G[sx][sy]=='#' || G[ex][ey]=='#'){
		cout<<"no";
	} else{
		dfs(sx,sy);//從起點開始搜尋
		//搜尋結束之後,判斷標記 
		if(f==1){
			cout<<"yes"; 
		}  else{
			cout<<"no";
		}
	}
	 
	
	
	return 0;
}


相關文章