扫雷 题目ID:9773

这道题怎么写啊

题目描述

【题目描述】

随着X年抗战的落幕,小日子过得很舒服的日本军队终被赶回了日本岛。虽然战争已经过去,但是依然存在许多的历史遗留问题。比如现在特工鱼大大面临的这个问题:他的一位同事在清理战场的时候因为敌人留下的地雷而壮烈牺牲。此事一出,举国震惊,鱼大大的上司要求鱼大大务必将此战场的所有地雷排扫干净,确保人民安全。现在鱼大大为了自身安全又把任务交给了你,他要求你务必将你负责的这块区域中的雷区清点干净,这样鱼大大知道了情况后排雷时的安全就有了大大的保障。

现在你做的是清点你负责的这片区域有多少块雷区,以及最大的雷区中有多少块地雷

注:地雷爆炸时会将四面八方紧邻的格子全部引爆,能互相引爆的地雷属于同一片雷区。

【输入格式】

第一行包含两个整数n,m

接下来的n行,每行输入m个字符来表示地图。2 ≤n,m ≤200

其中只有‘*’表示地雷,字符‘.’表示路径,字符‘#’表示杂物

【输出格式】

输出雷区的数量以及最大雷区中的地雷数量

【输入样例】

8 10
....**.#.#
.#.#......
..#...#.*#
.#.#.***..
#..***##.#
..#...#.#.
....*.....
.##*...##.

【输出样例】

3 7

这道题超简单的!

此帖子已被社区举报,现已被临时隐藏。

又没讲

DFS

我自闭了 + 八连同!

1 个赞

实在 不会 就 私聊!

1 个赞

我八连通的dfs不一样

void dfs(int x,int y){
	a[x][y]='.';
	for(int dx=-1;dx<=1;dx++){
		for(int dy=-1;dy<=1;dy++){
			int nx=x+dx,ny=y+dy;
			if(0<=nx&&nx<n&&0<=ny&&ny<m&&a[nx][ny]=='W')
			dfs(nx,ny);
		}
	}
}
1 个赞

不懂

1 个赞

你先试试就逝世,不会就能私聊

相比八连通扫雷dfs需要把其中的那个“W”改成“*”

此外,扫雷的主函数每次在执行dfs后,需要增加次数

其他的和八连通一样

AC了给解决方案啊喂!

2 个赞

我的55.00000000000001分的代码

总结


没骗你

#include<bits/stdc++.h>
using namespace std;
int n,m,res,cnt,maxx=INT_MIN;
char a[105][105];
void dfs(int x,int y){
	a[x][y]='.';
	cnt++;
	for(int dx=-1;dx<=1;dx++){
		for(int dy=-1;dy<=1;dy++){
			int nx=x+dx,ny=y+dy;
			if(0<=nx&&nx<n&&0<=ny&&ny<m&&a[nx][ny]=='*')
			dfs(nx,ny);
		}
	}
}
int main() {
	while(cin>>n>>m){
		int res=0;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>a[i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(a[i][j]=='*'){
					cnt=0;
					dfs(i,j);
					res++;
					maxx=max(maxx,cnt);
				}
			}
		}
		cout<<res<<" "<<maxx<<'\n';
	}
	return 0;
}

bro数组开小了

谢谢

这个嘛…