题目描述

在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。

不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习。

在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。

在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

输入输出格式

输入格式:

输入文件头一行由用空格隔开的两个整数R和C组成,1<=R,C<=1000,这两个数分别表示游戏棋盘的行数和列数。

接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。

输出格式:

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

就输出一段话“There are S ships.”,S表示船只的数量。

否则输出“Bad placement.”。

输入样例#1:

6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
输出:
There are 5 ships.
分析:

在洛谷上做这道题时晃一眼我还以为是联通块的水题,所以我快乐的敲起了联通块= =结果63分,那么正解是什么?

由题目可以知道图中不能出现以下几种情况:

1:                 2:                 3:              4:

# # .              # # .              # . .           . . #

# . .               . . #               # # .          . # #

知道了这个我们只需要特判以下就可以的得出结

代码:

#include <iostream>
#include <queue>
#include <cstring>
#include <string>
using namespace std;
const int N=+;
char Map[N][N];
bool vis[N][N],judge[N][N],fin;
int n,m,startx,starty,keay;
int dirx[]={,,-,};
int diry[]={,,,-};
struct Node
{
int x,y;
};
void bfs()
{
vis[startx][starty]=true;
judge[startx][starty]=false;
queue<struct Node> que;
struct Node now;
now.x=startx;now.y=starty;
que.push(now);
while(!que.empty())
{
now=que.front();
que.pop();
for(int i=;i<;i++)
{
int xx=now.x+dirx[i];
int yy=now.y+diry[i];
if(xx<||xx>n||yy<||yy>m) continue;
if(Map[xx][yy]=='.') continue;
if(vis[xx][yy]) continue;
vis[xx][yy]=true;
judge[xx][yy]=false;
struct Node next;
next.x=xx;next.y=yy;
que.push(next);
}
}
return;
}
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>Map[i][j];
if(Map[i][j]=='#')
judge[i][j]=true;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)//特判
{
if(Map[i][j]=='#'&&Map[i][j+]=='#'&&Map[i+][j]=='#'&&Map[i+][j+]=='.') fin=true;
if(Map[i][j]=='#'&&Map[i][j+]=='#'&&Map[i+][j+]=='#'&&Map[i+][j]=='.') fin=true;
if(Map[i][j]=='#'&&Map[i+][j]=='#'&&Map[i+][j+]=='#'&&Map[i][j+]=='.') fin=true;
if(Map[i][j+]=='#'&&Map[i][j]=='.'&&Map[i+][j]=='#'&&Map[i+][j+]=='#') fin=true;
}
}
if(!fin)//如果没有出现那4种情况
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(judge[i][j])
{
startx=i;starty=j;
bfs();
keay++; //记下联通块的个数
}
}
}
cout<<"There are "<<keay<<" ships."<<endl;
}
else
cout<<"Bad placement."<<endl;
return ;
}
05-11 17:04