• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
magicat
博客园    首页    新随笔    联系   管理    订阅  订阅
D. Solve The Maze

D. Solve The Maze

大意:建墙让所有好人可以到达坐标\((n,m)\),任何一个坏人都不能到达坐标\((n,m)\)

分析:

  1. 把坏人直接关起来,在坏人的四面建墙,
  2. 统计好人的人数
  3. 从坐标\((n,m)\)去遍历,整个地图,看能不能遇到所有好人

3可以通过dsu, flood-fill等去做吧

细节:

  1. 坏人的四面有好人,答案必为\(\text{NO}\)
  2. 坏人的四面中一个面可以到\((n, m)\),答案必为\(\text{NO}\)

更多细节见代码

int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
int n, m, cnt;
char op[55][55];
bool vis[55][55];
void dfs(int tx, int ty)
{
	for(int i = 0; i < 4; i++)
	{
		int x = tx + dx[i];
		int y = ty + dy[i];
		if(x < 1 || x > n || y < 1 || y > m || vis[x][y] || op[x][y] == '#')	
			continue;	
		vis[x][y] = true;
		if(op[x][y] == 'G')
			cnt--;
		dfs(x, y);
	}
}

void solve()
{   
	cnt = 0;
	memset(vis, false, sizeof vis);
	
	cin>>n>>m;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			cin>>op[i][j];
	bool ok = true;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(op[i][j] == 'B')
			{
				for(int k = 0; k < 4; k++)
				{
					int x = i + dx[k];
					int y = j + dy[k];
					if(x < 1 || x > n || y < 1 || y > m)	
						continue;
					if(op[x][y] == 'G')
						ok = false;
					if(op[x][y] == 'B')
						continue;
					op[x][y] = '#';
				}
			}
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(op[i][j] == 'G')
				cnt++;
	if(cnt != 0 && op[n][m] == '#')
	{
		cout<<"NO"<<endl;
		return;
	}
	dfs(n, m);
	if(cnt == 0 && ok)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;

    return;
}

本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/17341063.html

posted on 2023-04-21 16:59  magicat  阅读(39)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3