Pavel 喜歡網格迷宮。一個網格迷宮是一個 n × m 的長方形迷宮,其中每一個單元格要麼是空白的,要麼是牆體。您能夠從一個單元格走到另外一個單元格,只要兩個單元格均是空白的,且擁有一條公共的邊。java
Pavel 繪製了一個網格迷宮,包含的所有空白單元格造成了一個連通區域。換言之,您能夠從任何一個空白的單元格,走到其它任意的空白單元格。Pavel 的迷宮若是牆體太少,他就不喜歡這個迷宮。他但願將 k 個空白的單元格轉換爲牆體,使得剩餘的所有單元格仍然可以造成一個連通區域。請幫助他實現這個任務。spa
輸入code
第一行包含了三個整數 n, m, k (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]); } }