题目背景(题目链接)
题目描述
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 SX,SY,FX,FY,SX,SY代表起点坐标,FX,FY代表终点坐标。
接下来 $T$ 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。
样例输入 样例输出
2 2 1 1
1 1 2 2
1 2
题解
解题思路
经典的DFS+回溯题目,从起点向四周递归搜索,遇到边界,障碍或走过的路就回溯一步改变方向继续搜索,统计最终到达终点的次数(几道类似的题目:P1141,P1238)。详细思路见代码。
1 #include<bits/stdc++.h>//万能头文件 2 using namespace std; 3 int a,b,c,d; 4 int ans; 5 int z[101][101]; 6 int zx,zy; 7 int n,m,t; 8 void dfs(int p,int q) 9 { 10 if(p==c&&q==d) 11 { 12 ans++; 13 return; 14 }//如果到达终点,就回到上一层 15 z[p][q]=0; 16 if(z[p][q+1]!=0) 17 { 18 dfs(p,q+1); 19 z[p][q+1]=1; 20 }//如果右边可以走,就走 21 if(z[p][q-1]!=0) 22 { 23 dfs(p,q-1); 24 z[p][q-1]=1; 25 }//走左边 26 if(z[p-1][q]!=0) 27 { 28 dfs(p-1,q); 29 z[p-1][q]=1; 30 }//走上边 31 if(z[p+1][q]!=0) 32 { 33 dfs(p+1,q); 34 z[p+1][q]=1; 35 }//走下边 36 } 37 int main() 38 { 39 memset(z,0,sizeof(z));//将z数组全部赋值为0 40 41 cin>>n>>m>>t;//输入迷宫的长、宽以及障碍的数量 42 cin>>a>>b>>c>>d;//(a,b)为起点坐标,(c,d)为终点坐标 43 44 for(int i=1;i<=n;i++) 45 for(int j=1;j<=m;j++) 46 z[i][j]=1;//将迷宫区域全部赋值1,代表可以走 47 for(int i=1;i<=t;i++) 48 { 49 cin>>zx>>zy;//输入障碍的坐标 50 z[zx][zy]=0;//将障碍的坐标赋值为0,代表不可以走 51 } 52 dfs(a,b);//进行深搜 53 cout<<ans<<endl;输出路的数量 54 return 0;//完结撒花 55 }//提交记录