1744 迷宮

行胜于言Ibl發表於2024-11-24
#include<bits/stdc++.h>
using namespace std;
/*
二維陣列:地圖、標記陣列
遞迴:搜尋方法dfs(),透過一個座標搜尋四個方向 
其他:二維陣列中的上右下左方向陣列 
*/ 
int G[15][15]; //地圖 
bool vis[15][15];//標記陣列和地圖一樣大,1代表被走過,0代表沒有 
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //dx是橫座標  dy是縱座標 
int n;//n*n大小
int f = 0;//標記是否能走到,1代表能,0代表不能

//dfs()搜尋函式 
void dfs(int x,int y){
	if(x==n&&y==n){ //判斷該座標是終點 
		f=1; //修改標記能到達終點 
		return ;
	}
	//依次檢查4個方向
	for(int i=0;i<4;i++){
		//求出下一個目標點的座標 
		int xx = x+dx[i];
		int yy = y+dy[i];
		//判斷位置是否合法,全部成立 
			//地圖內 xx>=1&&xx<=n&&yy>=1&&yy<=n
			//可以通行/不為障礙物 G[xx][yy]!=1
			//沒有被走過 vis[xx][yy]==0
		if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&G[xx][yy]!=1
		&&vis[xx][yy]==0){
			vis[xx][yy]=1;//走這個點,標記走過
			dfs(xx,yy); //繼續搜尋這個點 
		} 
	} 
} 

int main(){
	//地圖輸入 
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>G[i][j];
		}
	} 
	//標記起點,開啟搜尋 
	vis[1][1]=1;
	dfs(1,1);
	
	//非0為真 
	if(f) cout<<"YES";
	else cout<<"NO";
	
	return 0;
}




相關文章