社区讨论

dfs 三子棋 30分求条

灌水区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2a93nnk
此快照首次捕获于
2024/10/15 17:38
去年
此快照最后确认于
2025/11/04 17:08
4 个月前
查看原帖
题目描述 33DAI 很喜欢三子棋。今天他在一张很大的方形棋盘上下棋,棋盘可以看作是一个 行 列的网格。(大家应该知道三子棋是下在格子里面的吧?)
33DAI 今天的玩法非常不一样。棋盘上有些位置上有棋子,有些位置上没有。所有的棋子都是己方棋子。33DAI 可以任选一个空着的位置下棋。如果他落子的位置能和周边的另外两个棋子构成三连(横着、竖着、斜着都可以),那么这就是一个好位置。
请你帮 33DAI 找找棋盘上有多少个好位置吧!
输入格式 第一行为空格隔开的两整数 ,。
接下来 行,每行为 个字符,描述了整个棋盘,第 行第 列的字符为 ,描述了第 行第 列的格子。
如果字符为 . 则表示这个位置没有棋子,如果字符为 # 则表示这个位置有一个己方棋子。
输出格式 一行一个整数,表示有多少个空着的位置是好位置。
5 7
.......
...#...
...##..
.......
...#..#
6 样例解释 下面用字符 o 标出了所有好位置
..oo...
...#...
..o##o.
...o.o.
...#..#
CPP
#include<bits/stdc++.h>
using namespace std;
long long cnt,n,m,dx[8]={-1,1,0,0,-1,1,-1,1},dy[8]={0,0,-1,1,-1,1,1,-1};
char a[100][100];
long long dfs(long long x,long long y){
	for(long long i=0;i<=7;i++){
		if(x-dx[i]>n||y-dy[i]>m||x+dx[i]>n||y+dy[i]>m||x-dx[i]<1||y-dy[i]<1||x+dx[i]<1||y+dy[i]<1){
			continue;
		}
		if(a[x+dx[i]][y+dy[i]]=='#'){
			a[x-dx[i]][y-dy[i]]='/';
		}
	}
	return 0;
}
signed main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		for(long long j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(long long i=1;i<=n;i++){
		for(long long j=1;j<=m;j++){
			if(a[i][j]=='#'){
				dfs(i,j);
			}
		}
	}
	for(long long i=1;i<=n;i++){
		for(long long j=1;j<=m;j++){
			if(a[i][j]=='/'){
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...