CodeForces - 377A Maze【dfs+思维】

传送门

题意

题意,给出n,m,k,三个长度,n,m,分别为地图的长宽,地图中有墙壁‘#’和空位置‘.’
想把k个空位置变成墙壁(用x表示)使‘.’还为一个连通区域

思路

想在‘.’中选择k个位置变成墙壁使剩下的点保持连通,那我们是不是可以反过来想呢?我们先让所有点的位置变为X
再用一个dfs找出要剩下的几个点这样他们肯定连通,问题得以解决.

AC 代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<sstream>
#include<stack>
#include<queue>
using namespace std;
int n,m,k,o=0,l=0;
char  p[520][520];
 int x1[]={1,0,-1,0};
 int YY[]={0,1,0,-1};//方向数组
void  dfs(int x,int y)
{
    if(o==l-k)
    {
        return ;}//找够了点就返回
     o++;
    p[x][y]='.';
    //printf("%d   ",o);
    for(int i=0;i<4;i++)
    {
        int xx=x+x1[i],yy=y+YY[i];
        if(xx>=0&&xx<n&&yy>=0&&yy<m&&p[xx][yy]=='X')//判断位置是否合法
        {dfs(xx,yy);
         if(o==l-k)
       return ;
        //o--;
       // p[xx][yy]='X';
    }

    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
       cin>>p[i];
       for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
            if(p[i][j]=='.')
            {p[i][j]='X';
            l++;}//统计点的数量并把点换为‘X’
        for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
          {
              o=0;
             if(p[i][j]=='X')//只要一个点是‘X’就用dfs
                  dfs(i,j);
         if(o==l-k)//l为原来一共有几个点,k为要使几个点变成墙,o是找到的点,如果相同就输出并结束程序
    {
         for(int k=0;k<n;k++)
    printf("%s\n",p[k]);
        return 0;}
          }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值