传送门:377a。
题意:给你一个图,将k个‘.’变成‘X’,使剩下的‘.’仍然连通,图中还有‘#’。
思维关键点是既然他要你修改k个,那么假设一开始有s个,则dfs搜索到k-s个的时候停止就好了,没被搜索到的就是要修改的,这样可以保证剩下的必定连通。
#include <iostream>
#include <cstdio>
#include <cstring>
int n,m,k;
int go[4][2]={0,1,1,0,0,-1,-1,0};
char map[505][505];
int book[505][505];
using namespace std;
void dfs(int r,int c)
{
if(!k)
return ;
k--;
//map[r][c]='0';
book[r][c]=1;//将要修改的标记出来,注意这里不能在回溯过程中再将标记取消
for(int i=0;i<4;i++)
{
int tr=r+go[i][0];
int tc=c+go[i][1];
if(tr>=0&&tr<n&&tc>=0&&tc<m&&!book[tr][tc]&&map[tr][tc]=='.')
{
dfs(tr,tc);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
getchar();
int t=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='.')
t++;
}
getchar();
}
k=t-k;
int flag=1;
for(int i=0;i<n&&flag;i++)
{
for(int j=0;j<m&&flag;j++)
{
if(map[i][j]=='.')//从第一个.开始搜索
{
//book[i][j]=1;
dfs(i,j);
flag=0;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
//printf("%d ",book[i][j]);
if(map[i][j]=='.'&&!book[i][j])//没被搜索到的修改
{
putchar('X');
}
//else if(map[i][j]=='.')
//putchar('X');
else
printf("%c",map[i][j]);
}
printf("\n");
}
return 0;
}

该博客详细介绍了如何解决Codeforces 377A问题,通过深度优先搜索(DFS)策略,改变k个 '.' 为 'X',确保剩余的 '.' 保持连通。关键在于,当初始 '.' 有s个时,只需搜索到k-s个,未被搜索到的点就是需要转换的目标,以此确保图的连通性。
dfs,思维&spm=1001.2101.3001.5002&articleId=52825009&d=1&t=3&u=507e7b2e857a4abab20c10d15be8aa71)
296

被折叠的 条评论
为什么被折叠?



