题解 CF377A Maze
题意简述
给出一个迷宫图,堵上其中的 (k) 个点,使得剩下的路是一条通路。把被修改的点标记为 'X' ,输出整个图。
题目思路
(dfs) ,因为要堵上一些点,使得剩下的为一条通路,我们可以反着操作。
先记所有的 ' . ' 的个数为 (sum) ,因为堵住的点数为 (k) ,则可以求出能走的点数为 (sum-k) 。
我们可以走出一条以 (sum-k) 为路径长度的通路,那么剩下的 ' . ' 就为被堵住的路了。
根据 (dfs) 走迷宫则可以写出代码。详见代码部分。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m,k;
char ch[501][501];
bool vis[501][501];
int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};//dfs走迷宫必备
int sum=0; //用来统计'.'的个数
void dfs(int x,int y)
{
if(!k) return;
for(int i=0; i<4; ++i) //dfs走迷宫板子
{
int nx=dx[i]+x;
int ny=dy[i]+y;
if(nx>n || ny>m || nx<1 || ny<1) continue;
if(ch[nx][ny]=='#' || vis[nx][ny]==1 || k<=0) continue;
vis[nx][ny]=1;
k--;//每走一格,剩余能走的步数-1
dfs(nx,ny);
}
}
int main()
{
n=read();m=read();k=read();
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
cin>>ch[i][j];
if(ch[i][j]=='.') sum++; //统计'.'的个数
}
}
k=(sum-k)-1; //计算出可以走的格子数
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
{
if(ch[i][j]=='.')
{
vis[i][j]=1;//起点的 vis 设为1
dfs(i,j);
goto pri; //这里,只要进行完了 dfs 之后就跳到下面
}
}
pri:; //跳转到这里
for(int i=1; i<=n; ++i) //输出操作
{
for(int j=1; j<=m; ++j)
{
if(ch[i][j]=='#') cout<<'#';
else if(ch[i][j]=='.')
{
if(vis[i][j]==1) cout<<".";
else cout<<"X";
}
}
cout<<endl;
}
return 0;
}