洛谷:P1331 海战

题目描述

在一个方形的盘上,放置了固定数量和形状的船只,每只船却不能碰到其它的船。在本题中,我们认为船是方形的,所有的船只都是由图形组成的方形。

求出该棋盘上放置的船只的总数。

输入格式

第一行为两个整数 R 和 C,用空格隔开,分别表示游戏棋盘的行数和列数。

接下来 R 行,每行 C 个字符,为 #.# 表示船只的一部分,. 表示水。

输出格式

一行一个字符串,如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个 # 号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出 There are S ships.,S 表示船只的数量。否则输出 Bad placement.

思路

一眼就是标准的Flood Fill算法,这没啥好说的。本题唯一要考虑的点,就是"正方形"这个条件,船的形状组合起来必须是一个正方形,我们考虑增加几个变量来记录在一次DFS当中能够蔓延的上,下左右边界。cnt是蔓延的点的数量,如果最终正方形的面积和cnt不等说明,这个正方形中有位置空缺,也就是船只形状不是正方形,直接输出Bad placement.。

题目给的这个输入样例参考价值不大,这里我补充一个样例。

样例

输入:

复制代码
4 4
#...
.#.#
.##.
.#..

输入:

复制代码
Bad placement.

C++源代码:

复制代码
#include <bits/stdc++.h>
using namespace std;
int n, m, ans;
char a[1003][1003];
int minl, maxr, mint, maxb, cnt;
void dfs(int x,int y) {//如何判断是否是矩形
	if (x < 0 || x >= n || y < 0 || y >= m) {//越界
		return;
	}
	if (a[x][y] == '.') {
		return;
	}
	a[x][y] = '.';
	++cnt;
	minl = min(minl, y);
	maxr = max(maxr, y);
	mint = min(mint, x);
	maxb = max(maxb, x);
	dfs(x + 1, y);
	dfs(x - 1, y);
	dfs(x, y + 1);
	dfs(x, y - 1);
}
int main() {//遇到水不会向前 遇到来过的不会向前
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '#') {
				++ans;
				minl = j, maxr = j, mint = i, maxb = i, cnt = 0;
				dfs(i, j);
				if (cnt != (maxr - minl + 1) * (maxb - mint + 1)) {
					printf("Bad placement.");
					return 0;
				}
			}
		}
	}
	printf("There are %d ships.", ans);
	return 0;
}
相关推荐
人工智能AI酱8 分钟前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager10 分钟前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_5180194811 分钟前
C++与机器学习框架
开发语言·c++·算法
一段佳话^cyx16 分钟前
详解逻辑回归(Logistic Regression):原理、推导、实现与实战
大数据·算法·机器学习·逻辑回归
qq_4176950518 分钟前
C++中的代理模式高级应用
开发语言·c++·算法
xiaoye-duck42 分钟前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划
ambition202421 小时前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法
没头脑的男大1 小时前
关于删除列表的那些事儿
算法
Book思议-1 小时前
【数据结构实战】线性表的应用
c语言·数据结构·算法·链表
qq_461489331 小时前
C++与Qt图形开发
开发语言·c++·算法