CF 377
题意
给定一个迷宫,要求添加 k 个墙后不影响迷宫的连通性
按要求输出迷宫
分析
dfs 一下,顺次删除叶节点直至满足题意,输出即可
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
string s[N];
int k;
int n , m;
int dir[4][2] = {{0 , 1} , {0 , -1} , {1 , 0} , {-1 , 0}};
void dfs(int x , int y)
{
if(k == 0)
{
return;
}
s[x][y] = '*';
for(int i = 0 ; i < 4 ; i++)
{
if(x + dir[i][0] > 0 && x + dir[i][0] <= n && y + dir[i][1] > 0 && y + dir[i][1] <= m && s[x + dir[i][0]][y + dir[i][1]] == '.')
{
dfs(x + dir[i][0] , y + dir[i][1]);
}
}
if(k > 0)
{
k--;
s[x][y] = 'X';
}
return;
}
int main()
{
int x , y;
bool flag = true;
scanf("%d %d %d" , &n , &m , &k);
for(int i = 1 ; i <= n ; i++)
{
cin>>s[i];
s[i] = ' ' + s[i];
if(flag)
{
for(int j = 1 ; j <= m ; j++)
{
if(s[i][j] == '.')
{
x = i;
y = j;
flag = false;
break;
}
}
}
}
dfs(x , y);
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
printf("%c" , (s[i][j] == '*' ? '.' : s[i][j]));
}
printf("\n");
}
return 0;
}
对比
krk
#include <cstdio>
#pragma comment(linker, "/STACK:16000000")
using namespace std;
const int Maxn = 505;
const int Maxd = 4;
const int dy[Maxd] = {-1, 0, 1, 0};
const int dx[Maxd] = {0, -1, 0, 1};
int n, m, k;
char B[Maxn][Maxn];
bool taken[Maxn][Maxn];
void Go(int r, int c)
{
if (r < 0 || r >= n || c < 0 || c >= m || B[r][c] == '#' || taken[r][c])
return;
taken[r][c] = true;
for (int i = 0; i < Maxd; i++)
Go(r + dy[i], c + dx[i]);
if (k) { B[r][c] = 'X'; k--; }
}
int main()
{
scanf("%d %d %d", &n, &m, &k);
for (int i = 0; i < n; 3i++)
scanf("%s", B[i]);
bool f = false;
for (int i = 0; i < n && !f; i++)
for (int j = 0; j < m && !f; j++)
if (B[i][j] == '.') { Go(i, j); f = true; }
for (int i = 0; i < n; i++)
printf("%s\n", B[i]);
return 0;
}
思路相同