zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】
    转 :hdoj 4857 逃生【反向拓扑】
    hdoj 3342 Legal or Not【拓扑排序】
    hdoj 2094 产生冠军
    poj 1789 Truck History【最小生成树prime】
    转:【拓扑排序详解】+【模板】
    hdoj 1285 确定比赛名次【拓扑排序】
    poj 2031 Building a Space Station【最小生成树prime】【模板题】
    zzuoj 10408: C.最少换乘【最短路dijkstra】
    [LC] 232. Implement Queue using Stacks
  • 原文地址:https://www.cnblogs.com/darkboy/p/9415934.html
Copyright © 2011-2022 走看看