深刻感受到了递归的力量…发明回溯的真的是个天才。
问题引入:
问题描述:
一个n*n的迷宫,所有的点都可以走:现请你按照 右、下、左、上的顺序进行搜索:找出从左上角到右下角的所有路径。
输 入:
一个整数 n(n≤5)代表迷宫的大小。输 出 :
从左上角 1,1 点走到右下角 n,n 点的所有路径。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include<iostream>
using namespace std;
char a[10][10];
int path[500][3];
void print(int k){
for(int i=1;i<=k;i++){
cout<<"("<<path[i][1]<<","<<path[i][2]<<")";
if(i!=k){
cout<<"=>";
}
}
cout<<endl;
}
void dfs(int x,int y,int k,int n){
path[k][1]=x;
path[k][2]=y;
a[x][y]='1';
if(x==n&&y==n){
print(k);
}
if(a[x+1][y]=='0') dfs(x+1,y,k+1,n);
if(a[x][y-1]=='0') dfs(x,y-1,k+1,n);
if(a[x-1][y]=='0') dfs(x-1,y,k+1,n);
if(a[x][y+1]=='0') dfs(x,y+1,k+1,n);
a[x][y]='0';
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]='0';
}
}
dfs(1,1,1,n);
return 0;
}
|
这个是应对四向的情况,我们可以进行一下优化以让其有应对多项的潜力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<iostream> using namespace std; char a[10][10]; int path[500][3]; int dx[5]={1,0,-1,0}; int dy[5]={0,-1,0,1}; void print(int k){ for(int i=1;i<=k;i++){ cout<<"("<<path[i][1]<<","<<path[i][2]<<")"; if(i!=k){ cout<<"=>"; } } cout<<endl;
} void dfs(int x,int y,int k,int n){ path[k][1]=x; path[k][2]=y; a[x][y]='1'; if(x==n&&y==n){ print(k); } for(int i=0;i<=3;i++){ int tx=x+dx[i]; int ty=y+dy[i]; if(a[tx][ty]=='0') dfs(tx,ty,k+1,n); } a[x][y]='0';
}
int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]='0'; } } dfs(1,1,1,n); return 0; }
|
大脑升级了感觉
希望国庆这几天搜索和dp能基本掌握叭