• 17-比赛2 C


    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 }
  • 相关阅读:
    关于表单提交的数据记录
    Hrbust 2363 Symmys (Manacher + DP)
    Codeforces 911F Tree Destruction(贪心 && 树的直径)
    Codeforces 903F Clear The Matrix(状态压缩DP)
    HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)
    Codeforces 912D Fishes (概率&期望,优先队列的应用)
    Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)
    HDU 6251 Inkopolis(2017 CCPC-Final,I题,环套树 + 结论)
    HDU 6249 Alice’s Stamps(2017 CCPC-Final G题,DP)
    2017 ACM-ICPC EC-Final 记录
  • 原文地址:https://www.cnblogs.com/darkboy/p/9415934.html
Copyright © 2020-2023  润新知