您的位置:首页 > 其它

CodeForce 377 A mazes (逆向思维)

2016-03-12 17:50 387 查看
题意:

给一个n*m的矩阵,#代表墙,.代表通路,给一个k值,代表需要你将矩阵中k个通路改为X,但是要保证剩下的点依然联通,然后输出改变有的矩阵。

分析:

因为原图是连通的,我们队原图进行递归深搜,从深搜树的底部开始往上删除结点,直至k等于0,这样既达到了删除k个节点也保证了剩余的节点连续。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <list>
#include <queue>
#include <map>
using namespace std;

char mp[550][550],vis[550][550];
int n,m,k;
int mx[4] = {0,0,1,-1};
int my[4] = {1,-1,0,0};

void dfs(int x,int y)
{
for(int i = 0; i < 4; i++)
{
int sx = x + mx[i];
int sy = y + my[i];
if(sx < 0 || sx >= n || sy < 0 || sy >= m)
continue;
if(vis[sx][sy] || mp[sx][sy] == '#')
continue;
vis[sx][sy] = 1;
dfs(sx,sy);
}
if(k)
{
mp[x][y] = 'X';
k--;
}
}
int main()
{
int t,C = 1;
//scanf("%d",&t);
while(scanf("%d%d%d",&n,&m,&k) != EOF)
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++)
scanf("%s",mp[i]);
int k = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(mp[i][j] == '.')
{
vis[i][j] = 1;
dfs(i,j);
k = 1;
break;
}
}
if(k)
break;
}
for(int i = 0; i < n; i++)
printf("%s\n",mp[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: