本文主要是介绍洛谷: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;
}
这篇关于洛谷:P1331 海战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!