题目:
走迷宫
描述
给一个n行m列的2维的迷宫,'S’表示迷宫额起点,‘T’表示迷宫的终点,’#‘表示不能通过的点,’.‘表示可以通过的点。你需要从’S’出发走到’T’,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。
输入
第一行输入n,m(1≤n,m≤10)表示迷宫大小。
接下来输入n行字符串表示迷宫。
输出
输出通过迷宫的方法数。
输入样例 1
2 3
S.#
…T
输出样例 1
2
题解:
#include"iostream"
using namespace std;
char a[15][15];
int flag[15][15];
int x[4] = {-1,0,1,0},y[4] = {0,1,0,-1};
int count = 0;
int a1,b1;
int n, m;
void dfs(int a1,int b1){
if(a[a1][b1] == 'T'){
count ++;
return ;
}
flag[a1][b1] = 1;
for(int i = 0;i < 4;i ++){
int tx = a1 + x[i];
int ty = b1 + y[i];
if(tx >= 0 && tx < n && ty >= 0 && ty < m && a[tx][ty] != '#' && flag[tx][ty] != 1){
dfs(tx,ty);
}
}
flag[a1][b1] = 0;
}
int main(){
cin >> n >> m;
for(int i = 0;i < n;i ++){
for(int j = 0;j < m;j ++){
cin >> a[i][j];
if(a[i][j] == 'S'){
a1 = i;
b1 = j;
}
}
}
dfs(a1,b1);
cout << count;
return 0;
}
我一开始时这样写的:
#include"iostream"
using namespace std;
char a[15][15];
int x[4] = {-1,0,1,0},y[4] = {0,1,0,-1};
int count = 0;
int a1,b1;
int n, m;
void dfs(int a1,int b1){
if(a[a1][b1] == 'T'){
count ++;
return ;
}
a[a1][b1] = '*';
for(int i = 0;i < 4;i ++){
int tx = a1 + x[i];
int ty = b1 + y[i];
if(tx >= 0 && tx < n && ty >= 0 && ty < m && a[tx][ty] != '#'){
dfs(tx,ty);
}
}
a[a1][b1] = '.';
}
int main(){
cin >> n >> m;
for(int i = 0;i < n;i ++){
for(int j = 0;j < m;j ++){
cin >> a[i][j];
if(a[i][j] == 'S'){
a1 = i;
b1 = j;
}
}
}
dfs(a1,b1);
cout << count;
return 0;
}
反思:
这次刷模板题,忽略了一个地方那就是 标记数组的创建,让我 懵比 了一上午,那么为啥要用到这个标记数组呢?换个角度想一想,不用会怎样?
从运行的角度来看,压根不能成功运行这个程序,如图:
但是实质的问题出在哪里呢?通过对样例的分析,我发现我真正的错误不是出在了标记数组,而是在这里我少了一个限制条件23333
我出错的代码就是因为 没有把之前如果走过的那些 就不能走了,这个限制条件加上,功夫不负有心人,我还是懂了,哈哈哈
接下来我就再整理一下,dfs做题的大体框架吧
int xx[4] = {-1,0,1,0},yy[4] = {0,1,0,-1}; // 上 右 下 左
void dfs(int x,int y){
if(x,y是终点){
count ++; // 计数,返回输出等等
return ;
}
a[x][y] = '#'; //标记(x,y)已经访问了
//接下来上下左右循环深搜
for(i = 0;i < 4;i ++){//这种遍历的格式很多,个人喜欢这种
int tx = x + xx[i];
int ty = y + yy[i];
if(){// tx 和 ty 都没有访问过且满足一写必要的条件,则继续往下深搜
dfs(tx,ty);
}
}
a[x][y] = '.'; // 解除标记,因为已经到底了,然后从底部依次往上解除标记
}
int main(){
//第一步 输入一些数 数组的值
//第二步 找到起点终点,调用dfs函数
//第三步 根据所求的值,设置条件语句等进行判断输出
return 0;
}
宝剑锋从磨砺出,梅花香自苦寒来