#include <bits/stdc++.h>
using namespace std;
int dx[4]={0,-1,1,0};
int dy[4]={1,0,0,-1};
int vis[1005][1005];
int n,m;
char a[1005][1005];
int ans=0;
void dfs(int x,int y)
{
vis[x][y]=1;
if(x>=n||x<0||y>=m||y<0)
return;
//超出边界就直接返回
for(int i=0;i<4;i++) //四个方位
{
int x1,y1;
x1=x+dx[i];
y1=y+dy[i];
if(x1>=n||x1<0||y1>=m||y1<0)
continue;
if(a[x1][y1]=='#'&&vis[x1][y1]==0) //如果这个点有船就标记一下
{
dfs(x1,y1);
}
}
}
//判断图是否合理
bool prime()
{
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
/*
6 6
.....#
##...#
##...#
..#..#
.....#
######
从(0,0) 开始往右边扫如果出现有.# ## 这样不合法的图就会直接输出
## #.
开始认为八个方位都要扫一遍结果出错了只用扫右边、下面、右下三个点
*/
int cnt1=0;
int cnt2=0;
if(a[i][k]=='#')
{
cnt1++;
}
if(a[i+1][k]=='#')
{
cnt1++;
}
if(a[i+1][k+1]=='#')
{
cnt1++;
}
if(a[i][k+1]=='#')
{
cnt1++;
}
// cout<<cnt1<<endl;
if(cnt1==3)
return false;
/
}
}
return true;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
cin>>a[i][k];
}
}
if(!prime())
{
cout<<"Bad placement."<<endl;
return 0;
}
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
if(a[i][k]=='#'&&vis[i][k]==0)
{
dfs(i,k);
ans++;
}
}
}
cout<<"There are "<<ans<<" ships."<<endl;
return 0;
}
p1331海战
最新推荐文章于 2024-03-01 22:14:15 发布