uva 784 Maze Exploration(迷宫探索) —— DFS

来源:互联网 发布:旅游景点数据库 编辑:程序博客网 时间:2024/05/14 04:47
/**序号:num_4作者:MrZhang日期:2016-5-21题目名称: Maze Exploration(迷宫探索)题目来源:uva —— 784 —— Maze Exploration网址:英文题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18558中文翻译:(中文为笔者自己个人翻译,几乎一致。但还是强烈建议您亲自阅读英文版题目)--------------------------------------如图1a,用二维表格描述了一个迷宫,这个迷宫有多个矩形房间。这个网格的每个点有一个符号表示。房间的墙壁使用相同的符号表示的,这些符号是除了'*'、'_'、空格之外的任何可打印的符号。例如,在图1中这些符号就是'X'。网格的其他部分用空格表示。如图2,所有的房间大小相同,都有3个单位长,1个单位厚的墙围成。另外,一堵墙由其分隔开的房间共享。房间之间有门连通,这些门都在墙壁的中间。这里没有室外的门。给你一个用'*'(这个'*'在该房间的中间)标记的房间作为开始房间,你的任务是从该房间出发涂刷该迷宫中所有能访问到的房间。如果在两个房间之间的墙上有一扇门,那么就能从一间房间进入另一间房间。如图1b,如果一个房间的的所有空间包括门都被符号'#'标记了,就说这间房间被涂刷了。输入:程序输入如下:1.第一行包含一个正数,表示需要涂刷的迷宫数量。2.剩下的部分就是这个迷宫。    输入的每一行长度可能不同。输入一个迷宫后需要再输入一行'_'作为分割线。每个迷宫最多有30行,每行最多有80个字符。程序从标准输入读取数据。输出:输出的迷宫与输入时的迷宫格式相同,包括分割线。程序往标准输出上输出。--------------------------------------数据样例:2XXXXXXXXXX   X   XX *     XX   X   XXXXXXXXXXX   XX   XX   XXXXXX_____XXXXXX   XX * XX   XXXXXX_____输出:XXXXXXXXXX###X###XX#######XX###X###XXXXXXXXXXX   XX   XX   XXXXXX_____XXXXXX###XX###XX###XXXXXX_____*/#include<iostream>#include<cstring>#include<cstdio>#define maxn 90using namespace std;char G[maxn][maxn];bool check(int x,int y){    char wall = G[0][0];    if(G[x][y] != wall && G[x][y] != '#') {        return true;    }    return false;}int dx[6] = {-1,1, 0,0};int dy[6] = { 0,0,-1,1};void DFS(int x,int y){    for(int i=0;i<4;i++){        int u = x + dx[i] , v = y + dy[i];        if(check(u,v)){            G[u][v] = '#';            DFS(u,v);        }    }}void printG(){    for(int i=0;i<maxn;i++){        if(G[i][0] == '_') break;        for(int j=0;j<maxn;j++){            if(G[i][j] == '_') break;            cout<<G[i][j];        }        cout<<endl;    }}int main(){    int counts;    cin>>counts;    getchar();    while(counts --){        /**初始化迷宫*/        memset(G,'_',sizeof(G));        /**输入迷宫及下划线*/        int start_i,start_j; //!保存 开始点的坐标        int row = 0;//!将str依次保存到迷宫的第row行        char str[maxn];//!依次存储迷宫的每一行,最后将保存分割线 //!gets()在向str中写入数据之前,会先将其内容清空        while(1){            gets(str);            if(str[0] == '_') break; //!说明一个迷宫输入完成            //!如果迷宫还未输入完成,就将刚刚输入的这一行存储到图G中            int length_str = strlen(str);            for(int j=0;j<length_str;j++) {                G[row][j] = str[j]; //!将新输入的这一行保存到迷宫的第row行                if(str[j] == '*'){                    start_i = row;                    start_j = j;                }            }            row ++;//!为下一次保存做准备        }        /***/        DFS(start_i,start_j);        /**输出迷宫*/        printG();        /**输出分隔符*/        for(int i=0;i<strlen(str);i++) cout<<str[i]; cout<<endl;    }    return 0;}/**总结:题型:大标题:图的遍历小标题:visited[]用指定字符表示。(此处为'#')原理:深度优先搜索(DFS)注意:1.gets(str)的使用:str最好用char数组。gets()在向字符数组中输入数据时会先将数组清空。2.本题在测试时,小编从上述英文网址中复制输入数据,出错,自己输入则对,原因不明,望读者多加注意,若知晓原因,希望留言分享。建议读者从本文复制数据测试。*/



0 0