深度搜索(迷宫)
#include <iostream> using namespace std; int migong[10000][10000];int sx,sy,ex,ey;int flag=0; void digui(int x,int y){ if(x==ex&&y==ey){ flag=1;return; } if(migong[x][y]==2){ return; } migong[x][y]=2; if(migong[x-1][y]==1){ digui(x-1,y); } if(migong[x+1][y]==1){ digui(x+1,y); } if(migong[x][y+1]==1){ digui(x,y+1); } if(migong[x][y-1]==1){ digui(x,y-1); } } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ char a; cin>>a; if(a=='S'){ sx=i;sy=j; migong[i][j]=1; } if(a=='X'){ migong[i][j]=0; } if(a=='.'){ migong[i][j]=1; } if(a=='T'){ ex=i;ey=j; migong[i][j]=1; } } } digui(sx,sy); if(flag){ cout<<"YES"; } else{ cout<<"NO"; } }
2 限制步数:回溯
#include <iostream> using namespace std; int migong[10000][10000];int sx,sy,ex,ey,t,n,m;int flag=0; void digui(int x,int y,int bu){ if(x==ex&&y==ey){ if(bu>t){ return; }; flag=1;return; } if(migong[x][y]==2){ return; } migong[x][y]=2; if(migong[x-1][y]==1){ digui(x-1,y,bu+1); migong[x][y]=1; } if(migong[x+1][y]==1){ digui(x+1,y,bu+1); migong[x][y]=1; } if(migong[x][y+1]==1){ digui(x,y+1,bu+1); migong[x][y]=1; } if(migong[x][y-1]==1){ digui(x,y-1,bu+1); migong[x][y]=1; } } int main(){ cin>>n>>m>>t; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ char a; cin>>a; if(a=='S'){ sx=i;sy=j; migong[i][j]=1; } if(a=='X'){ migong[i][j]=0; } if(a=='.'){ migong[i][j]=1; } if(a=='T'){ ex=i;ey=j; migong[i][j]=1; } } } digui(sx,sy,0); if(flag){ cout<<"YES"; } else{ cout<<"NO"; } }