1 // 2 // Created by Arc on 2020/5/5. 3 // 4 // 5 /* 6 * 题意大概就是,一个m*n的迷宫,0表示可通行,1表示不可通行,求一下有几种求法并写出路径 7 * 很明显的回溯 8 * 但这个题注意一个问题,就是走过一遍的地方要给标注上 9 * 10 * 其实拓展一下,如果不需要求出路径只判断能不能通过的话,就是一个联通块问题, 11 * dfs一定要记住把走过的路标记一下 12 * 13 * 这个题一个很好的地方就在于它存坐标: 14 * 在图表中存坐标用二维数组,第一维是第几步,第二维是x对应1,y对应2 15 * 16 * 在这个二维数组存数的时候不需要在后面多此一举赋值回来,因为早晚都是覆盖 17 * 但是!在判断是否走过的时候要赋值回来! 18 * 19 * 20 * 说一个自己很han的地方,一开始没有加上有没有通路的判断,然而第一个样例就是没有通路orz 21 * 于是本小白就开始伟大的单步! 22 * 当然并没有看出什么问题orz 23 */ 24 #include<bits/stdc++.h> 25 using namespace std; 26 int a[100][2]; 27 28 int n,m; 29 int fx[4]={0,0,1,-1}; 30 int fy[4]={1,-1,0,0};//这里是四种路线 31 int search(int i); 32 void print( int step); 33 bool c[100][100];//判断是否走过 34 int num=0; 35 /* 36 * c和num一定要弄成全局 37 */ 38 int main(){ 39 40 41 cin>>n>>m; 42 for (int i = 0; i < n ; ++i) { 43 for (int j = 0; j < m ; ++j) { 44 cin>>c[i][j]; 45 46 } 47 48 } 49 a[1][1]=0;//从(0,0)开始,所以第一步给i赋值 50 a[1][2]=0; 51 search(2); 52 if(num!=0) { 53 cout << "共有" << num << "种"<<endl; 54 } 55 else 56 cout<<"没有通路啊!"<<endl; 57 58 } 59 int search(int step){ 60 for(int i=0;i<4;i++){ 61 if(a[step-1][1]+fx[i]>=0 && a[step-1][1]+fx[i]< m && a[step-1][2]+fy[i]>=0 && a[step-1][2]+fy[i]<n && !c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]]) 62 //判断是否越界:上一步的加本次的是否越界,每一次的条件都是要卡死的 63 //最后要判断一下这个点可不可以走 64 { 65 a[step][1]=a[step-1][1]+fx[i]; 66 a[step][2]=a[step-1][2]+fy[i];//因赋值所以不用在最后"回溯"赋值咯 67 c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]]=1; 68 if(a[step][1]==m-1 && a[step][2]==n-1 ) 69 print(step); 70 else 71 search(step+1); 72 c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]]=0;//回溯是否可走 73 74 } 75 } 76 return 0; 77 } 78 void print( int step){ 79 num++; 80 cout<<num<<":"<<endl; 81 for (int i = 1; i <= step ; ++i) { 82 cout<<"("<<a[i][1]<<","<<a[i][2]<<")"<<endl; 83 84 } 85 86 87 }