链接:
https://codeforces.com/problemset/problem/377/A
题意:
帕维尔喜欢网格迷宫。网格迷宫是n × m矩形迷宫,每个单元格要么是空的,要么是墙。只有当两个单元格都为空且有共同的一面时,才能从一个单元格转到另一个单元格。
帕维尔画了一个网格迷宫,所有的空细胞形成一个连通的区域。也就是说,您可以从任何空单元格到任何其他单元格。帕维尔不喜欢迷宫的墙壁太小。他想要完全转变k空细胞进入墙壁,使所有剩余的细胞仍然形成一个连通的区域。帮帮他。
输入
3 4 2
#..#
..#.
#...
输出量
#.X#
X.#.
#...
输入
5 4 5
#...
#.#.
.#..
...#
.#.#
输出量
#XXX
#X#.
X#..
...#
.#.#
解:
dfs找连通块,找到足够(活细胞-变墙)以后其他全部变成墙
实际代码:
#include<iostream>
#include<cstdio>
using namespace std;
int map[505][505];
int book[505][505];
bool ans=0;
int lu=0;
int nst;
int dfs(int n,int m ,int gz,int x,int y)
{
nst++;
book[x][y]=1;
//cout<<x<<" "<<y<<endl;
//cout<<nst<<endl;
if(nst==gz)
{
ans=1;
return 0;
}
if(x-1>=1&&book[x-1][y]==0&&map[x-1][y]==-1&&ans==0) dfs(n,m,gz,x-1,y);
//cout<<"done1"<<endl;
if(x+1<=n&&book[x+1][y]==0&&map[x+1][y]==-1&&ans==0) dfs(n,m,gz,x+1,y);
//cout<<"done2"<<endl;
if(y-1>=1&&book[x][y-1]==0&&map[x][y-1]==-1&&ans==0) dfs(n,m,gz,x,y-1);
//cout<<"done3"<<endl;
if(y+1<=m&&book[x][y+1]==0&&map[x][y+1]==-1&&ans==0) dfs(n,m,gz,x,y+1);
//cout<<"done4"<<endl;
}
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char a;
cin>>a;
if(a=='#') map[i][j]=0;
if(a=='.')
{
map[i][j]=-1;
lu++;
}
}
}
for(int i=1;i<=n;i++)
{
if(ans==1) break;
for(int j=1;j<=m;j++)
{
if(ans==1) break;
if(map[i][j]==-1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
book[i][j]=0;
}
}
nst=0;ans=0;
dfs(n,m,lu-k,i,j);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(map[i][j]==0)
{
cout<<"#";
}
else if(book[i][j]==1) cout<<'.';
else cout<<"X";
}
cout<<endl;
}
}
限制:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output