深度搜索(迷宫)
#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";
}
}

浙公网安备 33010602011771号