海战--dfs+判断矩阵覆盖

luogu 1331在这里插入图片描述

题目分析:

  • 模型为数细胞那道题
  • 关键是如何判断矩阵覆盖:
    当矩阵覆盖时,必然有一下情况:

.#
##

或者
#.
##

或者
##
.#

或者
##
#.

  • 所以,我们可以通过这种方式来判断

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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值