Luogu P1331 海战

来源:互联网 发布:php cgi.exe 命令行 编辑:程序博客网 时间:2024/04/30 02:32

正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!左边有个“赞”字,你就顺手把它点了吧

题目描述

在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习。

在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

输入输出格式

输入格式:

输入文件头一行由用空格隔开的两个整数R和C组成,1<=R,C<=1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。

输出格式:

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

输入输出样例

输入样例#1:
6 8.....#.###.....###.....#.......##......##..#...#
输出样例#1:
There are 5 ships.

dfs模板题

评测记录 52ms / 5921KB


虽说这道题是我很久前写的,但是我今天突然想到,就把它翻了出来,因为这是一道很有代表性的搜索题目。

这道题的题目意思是,每个船只形状只能是一个矩形,如果两个船只靠在一起,那么就判定这个地图不合法。

想想便可知,如果出现两个矩形靠在一起,那么必然会有一个角上有三个*。我们可以举个例子:

....****...**.****...**.****...**.......

可以看出,这是一个合格的地图,它有两个船。那么,我们将左下角的船变化一下,使它不合法。

....****...*******...*******...***......

这时我们可以发现,(4, 1)处出现了三个的情况,(4, 4)处也出现了三个的情况,可是这种情况在原图形中是不存在的。这就说明了这种判断方法是正确的。


另外想说的事

本题其实是一道bfs模板题,但是也可以用dfs来解,由于这代码是我较早写的,那时我还不会bfs,所以我就用dfs来做了。有兴趣的朋友可以自行把它改为bfs版本。


然后,打了个dfs模板就很愉快地AC了

#include <iostream>using namespace std;int n, m;int mp[1010][1010];int ans;void dfs(int i, int j) {    if(mp[i][j] == 0) return;    mp[i][j] = 0;    dfs(i+1, j);    dfs(i, j+1);    dfs(i-1, j);    dfs(i, j-1);}int main() {    cin >> n >> m;    for(int i = 1; i <= n; ++i) {        for(int j = 1; j <= m; ++j) {            char c;            cin >> c;            if(c == '#') mp[i][j] = 1;            if(c == '.') mp[i][j] = 0;            if(mp[i][j] + mp[i][j-1] + mp[i-1][j] + mp[i-1][j-1] == 3) {                cout << "Bad placement.";                return 0;            }        }    }    for(int i = 1; i <= n; ++i) {        for(int j = 1; j <= m; ++j) {            if(mp[i][j] == 1) {                dfs(i, j);                ++ans;            }        }    }    cout << "There are " << ans << " ships.";    return 0;}