题解 CF377A Maze

题解 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;
}
原文地址:https://www.cnblogs.com/EdisonBa/p/13927603.html