迷宫问题
前言
在算法设计策略中,回溯法是比贪心法和动态规划法 更一般的方法。对于这一类的问题,其解可以表示为一个n元组(X1,X2,……Xn),求满足约束条件的可行解,或进一步求使目标函数取得最大(或最小)值的最优解问题。回溯法是一种通过搜索状态空间树来求解问题的可行解或者最优解的方法。
回溯法通过使用约束函数和限界函数来压缩需要实际生成的状态空间树的节点数,从而大大节省问题求解时间。
一、问题描述
一天小明掉进了一个迷宫里面,小明想逃出去,可怜的小明连迷宫是否有能逃出去的路都不知道。看在小明这么可怜的份上,就请聪明的你告诉小明是否有可以逃出去的路。
二、使用步骤
1.输入
第一行输入两个整数 n 和 m,表示这是一个 n×m 的迷宫。
接下来的输入一个 n 行 m 列的迷宫。其中 ‘S’ 表示小明的位置,’*‘表示墙,小明无法通过,’.‘表示路,小明可以通过’.'移动,'T’表示迷宫的出口(小明每次只能移动到四个与他相邻的位置——上,下,左,右)。
2.输出
输出一个字符串,如果小明可以逃出迷宫输出"yes",否则输出"no"。
3.测试数据
3.1 第一组
3.1.1输入
3 4
S**.
..*.
***T
3.1.1 输出
no
3.2 第二组
3.2.1输入
3 4
S**.
....
***T
3.2.1 输出
yes
三.源代码
#include <iostream>
using namespace std;
int n,m,visited[15][15]={0},ans=0;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
char a[15][15];
void maze(int x,int y){
int k;
visited[x][y]=1;
if(a[x][y]=='T'){
ans=1; return;
}
for(k=0;k<4;k++){
int cx=x+dx[k];
int cy=y+dy[k];
if(cx>=0&&cx<n&&cy>=0&&cy<m&&a[cx][cy]!='*'&&visited[cx][cy]==0){
maze(cx,cy);
}
}
}
int main(){
int i,j,x,y;
cin>>n>>m;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
x=i; y=j;
}
}
}
maze(x,y);
if(ans) cout<<"yes"<<endl;
else cout<<"no"<<endl;
return 0;
}
总结
以上就是今天要讲的内容,喜欢博主那就多读关注啦!!!