• CodeForce 377 A mazes(dfs+连通性问题)


    Pavel 喜欢网格迷宫。一个网格迷宫是一个 n × m 的长方形迷宫,其中每个单元格要么是空白的,要么是墙体。您可以从一个单元格走到另一个单元格,只要两个单元格均是空白的,且拥有一条公共的边。

    Pavel 绘制了一个网格迷宫,包含的全部空白单元格形成了一个连通区域。换言之,您可以从任何一个空白的单元格,走到其它任意的空白单元格。Pavel 的迷宫如果墙体太少,他就不喜欢这个迷宫。他希望将 k 个空白的单元格转换为墙体,使得剩余的全部单元格仍然能够形成一个连通区域。请帮助他实现这个任务。

    输入

    第一行包含了三个整数 nmk (1 ≤ n, m ≤ 500, 0 ≤ k < s),其中 n 和 m 分别是迷宫的高度和宽度,k 是 Pavel 希望加入的墙体数目,并且字母 s 表示原始迷宫中的空白单元格数目。

    接下来的 n 行中,每行包含 m 个字符。它们描述了原始的迷宫。如果某行中的一个字符等于 ".",则相应的单元格为空白;如果字符等于 "#",则单元格为墙体。

    输出

    打印 n 行,每行包含 m 个字符:符合 Pavel 需求的新迷宫。将已转换为墙体的原始空白单元格标识为 "X";其它单元格必须保留为未更改状态 (也就是 "." 和 "#")。

    数据保证:存在一个解决方案。如果有多个解决方案,可输出它们中的任意一个。

    示例

    输入
    3 4 2
    #..#
    ..#.
    #...
    输出
    #.X#
    X.#.
    #...
    输入
    5 4 5
    #...
    #.#.
    .#..
    ...#
    .#.#
    输出
    #XXX
    #X#.
    X#..
    ...#
    .#.#

    思路:每次深搜删除叶节点,即每次深搜到底,删除深搜的最后一个元素

    代码:
    import java.util.Scanner;
    
    public class Main{
            static int n,m,k;
            static final int N=505;
            static char map[][]=new char[N][N];
            static boolean vis[][]=new boolean[N][N];
            static void dfs(int x,int y){
                    if(x<0 || y<0 || x>=n || y>=m) return;
                    if(vis[x][y] || map[x][y]=='#') return;
                    vis[x][y]=true;
                    dfs(x+1,y);
                    dfs(x-1,y);
                    dfs(x,y+1);
                    dfs(x,y-1);
    //                vis[x][y]=false;  
                    if(k>0){
                            map[x][y]='X';
                            k--;
                    }
            }
            public static void main(String[] args) {
                    Scanner scan=new Scanner(System.in);
                    n=scan.nextInt();
                    m=scan.nextInt();
                    k=scan.nextInt();
                    for(int i=0;i<n;i++) map[i]=scan.next().toCharArray();
                    
                    for(int i=0;i<n&&k>0;i++)
                        for(int j=0;j<m&&k>0;j++)
                                if(map[i][j]=='.') 
                                    dfs(i,j);
                    
                    for(int i=0;i<n;i++) System.out.println(map[i]);
            }
    }
  • 相关阅读:
    Papervision3D Essentials中文版,附Papervision3D_2.1.920.swc和章节练习源码
    谷歌Chrome浏览器上安装调试(debugger)版本的Flash Player
    Flash运行时错误代码解释说明
    XML
    Android手机与电脑互通
    mysql
    j2ee
    Linux
    C_obj
    maven
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12238829.html
Copyright © 2020-2023  润新知