2014第一篇之膜拜鑫神搜索大神之CF的C题

A. Maze
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 n, m, k (1 ≤ n, m ≤ 500, 0 ≤ k < s), where n and 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.

Sample test(s)
Input
3 4 2
#..#
..#.
#...
Output
#.X#
X.#.
#...
Input
5 4 5
#...
#.#.
.#..
...#
.#.#
Output
#XXX
#X#.
X#..
...#
.#.#


大意很简单,n*m的迷宫里面"."代表可以走,"#"代表初始就有的墙,然后现在给你K堵墙让你去堵住一些点,但是仍然保证剩下的点是连通的,当然初始情况下的点是可以任意
到达的,一开始我的思路就是每次用DFS搜一遍然后判断每一个"."四连通方向上有多少个直接相连的"."然后从相连个数最小的开始堵起,后面发现每次搜索完之后还得更新加上
排序实现复杂,后来鑫神说可以换一种思路,就是从一个点开始走起,然后直到走到某个点路不通了,那么就把当前位置变成“X”,然后回到上一个位置继续进行搜索,直到所
给的K堵墙你全部用完了,剩下来的点必然连通。然后我就这样去敲了,运气不错直接过了,在此膜拜搜索大神鑫神~下面贴上代码,写挫了勿怪~
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;

char s[505][505];
bool vis[505][505];
int x[4]={1,0,-1,0};
int y[4]={0,1,0,-1};
int k;
int n,m;
void dfs(int a,int b)
{
    for(int i=0;i<4;i++)
    {
        int nx=a+x[i];
        int ny=b+y[i];
        if(nx>=0&&nx<n&&ny>=0&&ny<m&&vis[nx][ny]==0&&s[nx][ny]=='.')
        {
            vis[nx][ny]=1;
            dfs(nx,ny);

        }

    }
    if(k==0)
        return ;
    k--;
    s[a][b]='X';


}
int main()
{   int flag=0;
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='.')
            {
                dfs(i,j);
               flag=1;
                break;
            }
        }
        if(flag==1)
            break;
    }
    for(int i=0;i<n;i++)
    {
        cout<<s[i]<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以通过说出赞美的话,或者向他表示您的敬意来向他膜拜。例如:“gzn真是太厉害了,我真的很佩服你。”或者“gzn,你真的很优秀,我想向你学习。”但是,膜拜他人可能会让您看起来很不自信,所以我建议您可以尝试学习他的优秀之处,并努力成为一个更优秀的人。 ### 回答2: 如果你觉得一个叫gzn的人很强,想要膜拜他,以下是一些建议: 1. 尊重他:向gzn表达你对他的尊敬和赞赏,对他的成就和才能表示钦佩。遇到他时,礼貌地与他交谈,并注意言行举止的得体和尊重。 2. 学习他的优点:了解gzn的优秀之处,并从中学习。看看他取得成功的原因,是否是他的刻苦努力、智慧决策或者他在某个领域的专业知识。尝试模仿他的行为和思考方式,研究并学习他的成功之道。 3. 向他请教:如果有机会,向gzn提出问,寻求他的建议和指导。尊重地向他表达你的兴趣,并请教他在某个领域中的经验和见解。展示你对他的学习态度和对他智慧的崇拜。 4. 支持他的事业:如果gzn有自己的事业或项目,你可以尽力支持和关注他的努力和成果。参与他的项目,分享他的成就,为他的事业助力。这样,你不仅可以表达你的钦佩之情,还能够与他建立更紧密的联系。 5. 自我成长:尽管你想向gzn学习,但也要保持自己的独立思考和个性。不要完全模仿他,而是将他的优点和经验与你自己的才能和兴趣结合起来。追求自己的成长,并为自己设定目标,努力成为一个强大而有原创力的个体。 最重要的是,膜拜他不仅仅是以身体力行,更是通过行动向他证明你是一个值得尊敬和关注的人。承担起积极向上的行为和责任,以自己的努力和成就来回报他的关注和期待。 ### 回答3: 如果你觉得一个叫gzn的人很强,想要向他膜拜,你可以考虑以下几点: 1. 尊重与赞美:向gzn表示对他所取得成就的钦佩和赞美,这是最基本的表达方式之一。尊敬他的才华和技能,并且以谦逊和真诚的态度向他表达你的敬意。 2. 学习与模仿:观察gzn的行为和习惯,尝试学习他的成功之道。了解他取得成就的原因,从他的经验中汲取灵感,将其运用到自己的生活中。努力追求自己的目标,并向gzn学习如何提升自己的能力和技巧。 3. 合作与交流:如果你有机会与gzn进行交流或合作,抓住这个机会。分享自己的观点和想法,与他探讨各种话,寻求他的建议和指导。与gzn建立良好的合作关系,有助于你从他的经验中获益。 4. 成为他人的榜样:通过向身边的人展示你对gzn的尊敬和模仿,成为他人的榜样。在自己的生活和工作中发挥积极的影响力,传递正能量,鼓励他人追求自己的目标和理想。这样的行为也能够向gzn表达你对他的敬意。 不管你选择了哪种方式,保持真诚和谦虚的态度非常重要。膜拜并不意味着盲目崇拜,而是对别人的才华和成就表示敬意,并从中获得启发与动力。记住要相信自己的潜力,努力发展自己的实力,成为更好的自己。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值