有一个二维迷宫,n行m列,‘s’表示迷宫的起点,‘T’表示迷宫的终点,‘#’表示围墙,‘.’表示通路。现在从S出发,你不能穿墙,问你能否到达终点,若能将路线打印出来,若不能打印“no”
输入:
第一行输入n,m(1<n,m<1000)
接下来输入n行,每行m列的迷宫
输出:
输出迷宫路线,或“no”;
#include <iostream>
#include <string>
using namespace std;
bool b[105][105];
string a[105];
int n,m;
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
bool dfs(int x,int y){
int tx,ty;
//判断是否到达整点
if(a[x][y]=='t'){
return true;
}
//b用来标记是否遍历,a用来标记路线
b[x][y]=1;
a[x][y]='+';
//接下来四个转向
tx=x-1;
ty=y;
if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
tx=x;
ty=y-1;
if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
tx=x+1;
ty=y;
if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
tx=x;
ty=y+1;
if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
b[x][y]=0;
a[x][y]='.';
return false;
}
int main(){
int x,y;
cin>>n>>m;
//输入迷宫
for(int i=0;i<n;i++){
cin>>a[i];
}
//寻找起始点s
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='s'){
x=i;
y=j;
}
}
}
cout<<"---------------"<<endl;
//判断是否有正确路线
if(dfs(x,y)){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
else{
cout<<"no";
}
return 0;
}
运行结果如下:
该方法代码冗杂,其四个移动方向可以用一个循环代替:
#include <iostream>
#include <string>
using namespace std;
bool b[105][105];
string a[105];
int e[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
bool dfs(int x,int y){
int tx,ty;
if(a[x][y]=='t'){
return true;
}
b[x][y]=1;
a[x][y]='+';
for(int i=0;i<4;i++){
tx=x+e[i][0];
ty=y+e[i][1];
if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
}
b[x][y]=0;
a[x][y]='.';
return false;
}
int main(){
int x,y;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='s'){
x=i;
y=j;
}
}
}
cout<<"---------------"<<endl;
if(dfs(x,y)){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
else{
cout<<"no";
}
return 0;
}
整两中本质是一样的,因此时间复杂度都是一样的,但后者代码量少一些。