1. 程式人生 > >洛谷 P1605 迷宮【DFS】

洛谷 P1605 迷宮【DFS】

題目背景

迷宮 【問題描述】

給定一個N*M方格的迷宮,迷宮裡有T處障礙,障礙處不可通過。給定起點座標和

終點座標,問: 每個方格最多經過1次,有多少種從起點座標到終點座標的方案。在迷宮

中移動有上下左右四種方式,每次只能移動一個方格。資料保證起點上沒有障礙。

輸入樣例 輸出樣例

【資料規模】

1≤N,M≤5

題目描述

輸入輸出格式

輸入格式:

 

【輸入】

第一行N、M和T,N為行,M為列,T為障礙總數。第二行起點座標SX,SY,終點

座標FX,FY。接下來T行,每行為障礙點的座標。

 

輸出格式:

 

【輸出】

給定起點座標和終點座標,問每個方格最多經過1次,從起點座標到終點座標的方

案總數。

 

輸入輸出樣例

輸入樣例#1: 複製

2 2 1
1 1 2 2
1 2

輸出樣例#1: 複製

1
#include<iostream>
#include<cstring>
using namespace std;
int n,m,t,sx,sy,ex,ey,ans,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int ma[6][6];
bool vis[6][6];
void DFS(int x,int y){
	vis[x][y]=1;
	if(x==ex&&y==ey){//結束 
		ans++;
		return;
	} 
	else{
		for(int i=0;i<4;i++) {
			int fx=x+dx[i],fy=y+dy[i];
			if(ma[fx][fy]==-1&&vis[fx][fy]==0){
				vis[fx][fy]=1;
				DFS(fx,fy);
				vis[fx][fy]=0;//回溯 
			}
		} 
	}
}
int main(){
	cin>>n>>m>>t>>sx>>sy>>ex>>ey;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) ma[i][j]=-1;
	}
	memset(vis,0,sizeof(vis));	
	int a,b;
	while(t--){
		cin>>a>>b;
		ma[a][b]=1;//障礙
	}
	ans=0;
	DFS(sx,sy);
	cout<<ans<<endl;
	return 0;
	
}




/* 
DFS模板 
int search(int t)
{
    if(滿足輸出條件)
    {
        輸出解;
    }
    else
    {
        for(int i=1;i<=嘗試方法數;i++)
            if(滿足進一步搜尋條件)
            {
                為進一步搜尋所需要的狀態打上標記;
                search(t+1);
                恢復到打標記前的狀態;//也就是說的{回溯一步}
            }
    }
}
*/