CodeForce 377 A mazes(dfs+連通性問題)

Pavel 喜歡網格迷宮。一個網格迷宮是一個 n × m 的長方形迷宮,其中每一個單元格要麼是空白的,要麼是牆體。您能夠從一個單元格走到另外一個單元格,只要兩個單元格均是空白的,且擁有一條公共的邊。java

Pavel 繪製了一個網格迷宮,包含的所有空白單元格造成了一個連通區域。換言之,您能夠從任何一個空白的單元格,走到其它任意的空白單元格。Pavel 的迷宮若是牆體太少,他就不喜歡這個迷宮。他但願將 k 個空白的單元格轉換爲牆體,使得剩餘的所有單元格仍然可以造成一個連通區域。請幫助他實現這個任務。spa

輸入code

第一行包含了三個整數 nmk (1 ≤ n, m ≤ 500, 0 ≤ k < s),其中 n 和 m 分別是迷宮的高度和寬度,k 是 Pavel 但願加入的牆體數目,而且字母 s 表示原始迷宮中的空白單元格數目。blog

接下來的 n 行中,每行包含 m 個字符。它們描述了原始的迷宮。若是某行中的一個字符等於 ".",則相應的單元格爲空白;若是字符等於 "#",則單元格爲牆體。ci

輸出input

打印 n 行,每行包含 m 個字符:符合 Pavel 需求的新迷宮。將已轉換爲牆體的原始空白單元格標識爲 "X";其它單元格必須保留爲未更改狀態 (也就是 "." 和 "#")。it

數據保證:存在一個解決方案。若是有多個解決方案,可輸出它們中的任意一個。io

示例class

輸入
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]);
        }
}
相關文章
相關標籤/搜索