题目背景
在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了 F-2003 飞机。
此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们培养了一些新海军指挥官。军官们选择了“海战”游戏来帮助他们学习。
题目描述
在一个方形的盘上,放置了固定数量和形状的船只,每只船却不能碰到其它的船。在本题中,我们认为船是方形的,所有的船只都是由图形组成的方形。
求出该棋盘上放置的船只的总数。
输入格式
第一行为两个整数 R 和 C,用空格隔开,分别表示游戏棋盘的行数和列数。
接下来 R 行,每行 C 个字符,为 # 或 .:# 表示船只的一部分,. 表示水。
输出格式
一行一个字符串,如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个 # 号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出 There are S ships.,S 表示船只的数量。否则输出 Bad placement.。
输入输出样例
输入 #1
6 8 .....#.# ##.....# ##.....# .......# #......# #..#...#
输出 #1
There are 5 ships.
说明/提示
对于 100%100% 的数据,1≤R,C≤1000。
解题经过
一开始,晕晕乎乎既没有判断接触,dfs也不对,然而A了一个测试点。

后面改了,结果全WA(RE)了。。。

于是换了一种做法

忘判断访问了,91。。。
最后终于AC了。

AC代码
#include<bits/stdc++.h>
using namespace std;
int r,c,sum=0;
bool vis[1001][1001]= {0};
char a[1001][1001];
void dfs(int x,int y)
{
if(vis[x][y])
return;
int xx = x+1;
int yy = y+1;
vis[x][y]=true;
if(xx<r)
{
if(a[xx][y]=='#')
dfs(xx,y);
if(yy<c && a[x][yy]=='#')
dfs(x,yy);
}
else
if(yy<c && a[x][yy]=='#')
dfs(x,yy);
}
int main()
{
cin>>r>>c;
for(int i=0; i<r; i++)
cin>>a[i];
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if(a[i][j] == '.')
{
continue;
}
int scount = 0;
int ii = i+1;
int jj = j+1;
if(ii>=r)
ii = i-1;
if(jj>=c)
jj = j-1;
if(a[ii][j]=='#')
scount++;
if(a[i][jj]=='#')
scount++;
if(a[ii][jj]=='#')
scount++;
if(scount==2)
{
cout<<"Bad placement.";
return 0;
}
}
}
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if(!vis[i][j] && a[i][j]=='#')
{
dfs(i,j);
sum++;
}
}
}
cout<<"There are "<<sum<<" ships.";
return 0;
}
附:学校作业,不喜勿喷:)

403

被折叠的 条评论
为什么被折叠?



