思路:
先输入 ,然后再从头开始把整个图过一遍,如果发现有任意4个块内只有三个‘#’,则跳出循环并输出“Bad placement”,否则以每个块的右下角为基准,判断其是否为一个块。
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
#define ll long long
char g[1010][1010];
int main()
{
int r,c;
scanf("%d%d",&r,&c);
for(int i = 0; i < r; i++)
{
scanf("%s",&g[i]);
}
int ans = 0,flag = 0;
for(int j = 0; j < r; j++)
{
for(int i = 0; i < c; i++)
{
int h = 0,s = 0;
if(g[j][i] == '#' && g[j+1][i] != '#' && g[j+1][i+1] != '#' && g[j][i+1] != '#')
{
ans++;
}
for(int k = j; k <= j+1; k++)
{
for(int p = i; p <= i+1; p++)
{
if(g[k][p] == '#')
{
h++;
}
else
{
s++;
}
}
}
if(h == 3 && s == 1)
{
flag = 1;
break;
}
}
}
if(flag == 1)
printf("Bad placement.");
else
printf("There are %d ships.\n",ans);
}