1791: 算法3-3:迷宫
时间限制: 1 Sec 内存限制: 32 MB提交: 11 解决: 9
[ 提交][ 状态][ 讨论版]
题目描述
有一个 10 x 10 的迷宫,起点是‘S’,终点是‘E’,墙是‘#’,道路是空格。一个机器人从起点走到终点。当机器人走到一个通道块,前面已经没有路可走时,它会转向到当前面向的右手方向继续走。如果机器人能够过,则留下足迹‘*’,如果走不通,则留下标记‘!’。
下面给出书中的算法,请你模拟机器人的走法输出最终的状态。

图:迷宫算法
输入
一个 10 x 10 的二维字符数组。
输出
机器人走过的路径状态。
样例输入
##########
#S # # #
# # # #
# ## #
# ### #
# # #
# # # #
# ### ## #
## E#
##########
样例输出
##########
#**#!!!# #
# *#!!!# #
#**!!## #
#*### #
#***# #
# #***# #
# ###*## #
## ****#
##########
提示
这道题是数据结构课上的一道题,当时没做出来,感觉自己编写队列的太难了。虽然思路是一样的。
学弟学妹们大一下学期,很快就会接触到数据结构了,希望大家多多练练,不要觉得麻烦,我现在就是觉得当时练的少,没了书很多东西自己敲不出来
暑假训练,做了搜索的专题,所以现在拿出来再写一次,用的是DFS方法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char map[15][15];
int visti[15][15];
int flag=1;
int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; //每次碰到障碍只能向右,所以顺序不能乱;
void dfs(int x,int y) {
if(map[x][y]=='E') { //到达出口,则输出路径
map[x][y]='*';
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++)
printf("%c",map[i][j]);
printf("\n");
}
flag=0; //标记符,如果找到出口,则结束DFS;
}
map[x][y]='*';
visti[x][y]=1;
for(int i=0; i<4; i++) {
int newx=x+dir[i][0];
int newy=y+dir[i][1];
if(newx<10 && newy>=0 && newy<10 && newy>=0 && flag) //不能超过边界
if(!visti[newx][newy] && (map[newx][newy]==' ' || map[newx][newy]=='E')) //空白的地方才能走,visti数组用来标记是否遍历过,剪枝叶
dfs(newx,newy);
}
map[x][y]='!';//不能走到,但是遍历过,所以有置为;
}
int main() {
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++)
scanf("%c",&map[i][j]);
getchar(); //注意换行符要读掉
}
memset(visti,0,sizeof(visti));
for(int i=0; i<10; i++)
for(int j=0; j<10; j++) {
if(map[i][j]=='S'){ //找到开始的位置
dfs(i,j);
break;
}
}
}