打卡信奥刷题(1417)用C++实现信奥 B4297 [蓝桥杯青少年组国赛 2022] 翻卡片

B4297 [蓝桥杯青少年组国赛 2022] 翻卡片

题目描述

小蓝在玩翻卡片游戏,每张卡片一面写着大写字母 A,另一面写着大写字母 B。首先将卡片排成一个 N×NN \times NN×N 的矩阵。有的卡片是 A 面朝上,有的卡片是 B 面朝上。

现给定 NNN 的值,及 N×NN \times NN×N 矩阵中每张卡片的状态,请你帮助小蓝挑选一张 B 面的卡,翻转成 A 面,使得翻转后的上、下、左、右四个方向相连的 A 面卡片最多,并将相连最多的卡片数量输出。

例如:N=3N=3N=33×33 \times 33×3 的矩阵中的卡片状态如下:

ABB
ABA
BAB

选择第二行第二列的那张 B 面卡片,翻转为 A 面,可以使翻转后四个方向相连的 A 面卡片最多,为 555 张。

ABBABB
ABA→\rightarrowAAA
BABBAB

输入格式

第一行输入一个正整数 NNN2≤N≤502 \leq N \leq 502N50),表示矩阵的行数和列数。

第二行开始输入 NNN 行,每行输入 NNN 个字符(A 或者 B),表示矩阵中卡片状态,字符之间以一个空格隔开。

输出格式

输出一个整数,表示翻转后相连的 A 面卡片的最大数量。

输入输出样例 #1

输入 #1

3
A B B
A B A
B A B

输出 #1

5

C++实现

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define max(a,b) (a>b?a:b)
int n,ans,now,fx[4] = {1,0,-1,0},fy[4] = {0,1,0,-1};
char a[55][55];
bool vis[55][55];
void check(int x,int y){
	++now;
	vis[x][y] = 1;
	for(int i = 0;i < 4;++i){
		int xx = x + fx[i],yy = y + fy[i];
		if(xx <= 0 || yy <= 0 || xx > n || yy > n || vis[xx][yy] == 1 || a[xx][yy] == 'B') continue;
		check(xx,yy);
	} 
}
signed main(){
    cin.tie(0),cout.tie(0);
    cin >> n;
    for(int i = 1;i <= n;++i){
		for(int j = 1;j <= n;++j){
			cin >> a[i][j];
		}
	}
	for(int i = 1;i <= n;++i){
		for(int j = 1;j <= n;++j){
			if(a[i][j] == 'A') continue;
			memset(vis,0,sizeof(vis));//初始化 
			a[i][j] = 'A',now = 0;//初始化*2 
			check(i,j);//搜索看看有几个A联通 
			ans = max(now,ans);//取最大值 
			a[i][j] = 'B'; 
		}
	}
	cout << ans;
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值