17-比赛2 C - Maze (dfs)

Pavel loves grid mazes. A grid maze is an n × m rectangle maze where each cell is either empty, or is a wall. You can go from one cell to another only if both cells are empty and have a common side.

Pavel drew a grid maze with all empty cells forming a connected area. That is, you can go from any empty cell to any other one. Pavel doesn't like it when his maze has too little walls. He wants to turn exactly k empty cells into walls so that all the remaining cells still formed a connected area. Help him.

Input

The first line contains three integers nmk (1 ≤ n, m ≤ 500, 0 ≤ k < s), where nand m are the maze's height and width, correspondingly, k is the number of walls Pavel wants to add and letter s represents the number of empty cells in the original maze.

Each of the next n lines contains m characters. They describe the original maze. If a character on a line equals ".", then the corresponding cell is empty and if the character equals "#", then the cell is a wall.

Output

Print n lines containing m characters each: the new maze that fits Pavel's requirements. Mark the empty cells that you transformed into walls as "X", the other cells must be left without changes (that is, "." and "#").

It is guaranteed that a solution exists. If there are multiple solutions you can output any of them.

Examples

Input
3 4 2
#..#
..#.
#...
Output
#.X#
X.#.
#...
Input
5 4 5
#...
#.#.
.#..
...#
.#.#
Output
#XXX
#X#.
X#..
...#
.#.#

题意:
插入 k 个 X 且保持所有的 '.' 保持贯通
====================================================================================================================================================
怎么样才能使插入的 X 没有阻断路的连通,,想一想DFS,不撞南墙不回头的理论,只要沿着一个点一路走到底,直到不能走为止,那么这个末端放上X一定不会阻断其它'.'的连贯
如果所有末端 插入完毕之后,还有X没有放入,那么末端之后紧挨着的点就变成了末端,根据DFS走到末端后会原路返回,那么剩下的X跟着原路返回时插入就行了。
====================================================================================================================================================
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char Map[510][510];
 4 bool book[510][510];
 5 int n,m,k;
 6 void dfs(int x,int y)
 7 {
 8     if(x<0||x>=n||y<0||y>=m) return;
 9     if(Map[x][y]!='.'||book[x][y]==1) return ;
10     book[x][y]=1;
11     for(int i=1;i<=4;i++)
12     {   //四个方向
13         if(i==1)  dfs(x+1,y);
14         if(i==2)  dfs(x-1,y);
15         if(i==3)  dfs(x,y+1);
16         if(i==4)  dfs(x,y-1);
17     }
18     //当遍历到底了之后,即循环了四次无法继续走下去时
19     if(k!=0)
20         Map[x][y]='X',k--;
21 }
22 int main()
23 {
24       scanf("%d%d%d",&n,&m,&k);
25         for(int i=0;i<n;++i)
26             scanf("%s",Map[i]);
27 
28         for(int i=0;i<n;++i)
29             {
30                 for(int j=0;j<m;j++)
31                 {
32                     dfs(i,j);
33                     if(k==0) break;
34                 }
35                 if(k==0) break;
36             }
37         for(int i=0;i<n;i++)
38             puts(Map[i]);
39     return 0;
40 }

猜你喜欢

转载自www.cnblogs.com/darkboy/p/9415934.html