传送门: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]