洛谷 P1605 迷宮【DFS】
阿新 • • 發佈:2018-11-06
題目背景
迷宮 【問題描述】
給定一個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); 恢復到打標記前的狀態;//也就是說的{回溯一步} } } } */