題目背景
給定一個N*M方格的迷宮,迷宮里有T處障礙,障礙處不可通過。給定起點坐標和終點坐標,問: 每個方格最多經過1次,有多少種從起點坐標到終點坐標的方案。在迷宮中移動有上下左右四種方式,每次只能移動一個方格。數據保證起點上沒有障礙。
輸入格式
第一行N、M和T,N為行,M為列,T為障礙總數。第二行起點坐標SX,SY,終點坐標FX,FY。接下來T行,每行為障礙點的坐標。
輸出格式
給定起點坐標和終點坐標,問每個方格最多經過1次,從起點坐標到終點坐標的方案總數。
幾個數組:
*vis數組,記錄位置是否已經訪問過,因為我們如果重復不斷地訪問已經訪問過的位置,很有可能在一個環里導致死循環
*正常遍歷四個方向可以合並成一個循環,其中dir1和dir2兩個數組組合來表示上下左右四個方向
具體思路:
每從當前位置走到下一個位置,直到無路可走,回溯,每次判斷當前位置是否為終點,是就方案數+1
1 int map[6][6];//地圖;
2 bool vis[6][6];//走過的標記;
3 int dx[4]={0,0,1,-1}; 4 int dy[4]={-1,1,0,0}; 5 for(int i=0;i<=3;i++) 6 { 7 if(vis[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1) 8 { 9 vis[x][y]=1; 10 dfs(x+dx[i],y+dy[i]); 11 vis[x][y]=0; 12 } 13 }
1 #include<iostream>
2 #include<cstdlib>
3 #include<cstdio>
4 #include<cmath>
5 using namespace std; 6 int map[6][6];//地圖;
7 bool vis[6][6];//走過的標記;
8 int dx[4]={0,0,1,-1}; 9 int dy[4]={-1,1,0,0}; 10 int total,fx,fy,sx,sy,T,n,m,l,r; 11 void dfs(int x,int y) 12 { 13 if(x==fx&&y==fy) 14 { 15 total++; 16 return; 17 } 18 else
19 { 20 for(int i=0;i<=3;i++) 21 { 22 if(vis[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1) 23 { 24 vis[x][y]=1; 25 dfs(x+dx[i],y+dy[i]); 26 vis[x][y]=0; 27 } 28 } 29 } 30 } 31 int main() 32 { 33 cin>>n>>m>>T; 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=m;j++) 36 map[i][j]=1; 37 scanf ("%d%d",&sx,&sy); 38 scanf ("%d%d",&fx,&fy); 39 for(int u=1;u<=T;u++) 40 { 41 scanf("%d%d",&l,&r); 42 map[l][r]=0; 43 } 44 dfs(sx,sy); 45 cout<<total; 46 return 0; 47 }