题解 - 并查集 + 搜索 (海战 + 打击犯罪(black))路途遥远 加油

这篇博客介绍了如何利用并查集和搜索算法解决两个问题:1270海战游戏的船只计数,以及2927打击犯罪问题的最少数目。对于海战游戏,通过深度优先搜索判断船是否相邻,合法则输出船只数量,否则输出错误信息。打击犯罪问题中,通过倒序枚举并查集,寻找最小的打击团伙数量以使最大集团危险程度不超过n/2。
[1]1270海战
题目描述

在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。
输入
输入文件头一行由用空格隔开的两个整数R和C组成,1< =R,C< =1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。
输出
为每一个段落输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。

样例输入

6 8
…#.#
##…#
##…#
…#
#…#
#…#…#

样例输出

There are 5 ships.

提示
思路

dfs连通块, 套模板

void dfs(int x,int y){
	a[x][y]='.';
	int i,j;
	for(i = 1; i <= 4; i++){
		int xx= x+ix[i];
		int yy =y+iy[i];
		if(xx>0 && xx<=n && yy>0 && yy<=m && a[xx][yy] == '#'){
			dfs(xx,yy);
		}
	}
	return ;
}

要注意特判的情况,即这道题的难点在于判断是否有船相邻。 通过自己模拟的数据可以得出结论: 如果图是不和法的,一定存在如下结构:

# #   或 # #  或 # #  或  . #
. #      # .     # .      # #

即在一个2*2的方格中有三个#(暴力)

#include <bits/stdc++.h>
using namespace std;
int ix[5] = {
   
   0,1,0,-1,0};
int iy[5] = {
   
   0,0,1,0,-1};
int n,m,s;
char a[1005][1005]; 
bool check(int x,int y)//特判Bad placement的情况 
{
   
   
	int c(0);
	if(a[x][y]=='#')
	{
   
   
		c++;
	}
	if(a[x+1][y]=='#')
	{
   
   
		c++;
	}
	if(a[x][y+1]=='#')
	{
   
   
		c++;
	}
	if
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值