luogu 1331![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5b3c80a7d80306c1a5e8d107607356d6.png)
题目分析:
- 模型为数细胞那道题
- 关键是如何判断矩阵覆盖:
当矩阵覆盖时,必然有一下情况:
.#
##
或者
#.
##
或者
##
.#
或者
##
#.
- 所以,我们可以通过这种方式来判断
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 1100
#define maxm 1100
int n,m,a[maxn][maxm];
char c[maxm];
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
int pd_(int x,int y) {
int pdc=0;
if(a[x][y]) ++pdc;
if(a[x+1][y]) ++pdc;
if(a[x][y+1]) ++pdc;
if(a[x+1][y+1]) ++pdc;
if(pdc==3) return 1;
else return 0;
}
void dfs_(int x,int y) {
a[x][y]=0;
for(int i=1;i<=4;++i) {
int px=x+dx[i];
int py=y+dy[i];
if(px<1||py<1||px>n||py>m) continue;
if(!a[px][py]) continue;
dfs_(px,py);
}
}
int main() {
freopen("a.txt","r",stdin);
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
scanf("%s",c);
for(int j=0;j<m;++j) {
if(c[j]=='#') a[i][j+1]=1;
}
}
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(pd_(i,j)) {
printf("Bad placement.");
exit(0);
}
}
}
int ans=0;
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(a[i][j]) {
++ans;
dfs_(i,j);
}
}
}
printf("There are %d ships.",ans);
return 0;
}