迷宫 dfs

来源:互联网 发布:英文写作软件 知乎 编辑:程序博客网 时间:2024/05/21 22:41

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;            }        }}


原创粉丝点击