B4297 [蓝桥杯青少年组国赛 2022] 翻卡片
题目描述
小蓝在玩翻卡片游戏,每张卡片一面写着大写字母 A,另一面写着大写字母 B。首先将卡片排成一个 N×NN \times NN×N 的矩阵。有的卡片是 A 面朝上,有的卡片是 B 面朝上。
现给定 NNN 的值,及 N×NN \times NN×N 矩阵中每张卡片的状态,请你帮助小蓝挑选一张 B 面的卡,翻转成 A 面,使得翻转后的上、下、左、右四个方向相连的 A 面卡片最多,并将相连最多的卡片数量输出。
例如:N=3N=3N=3,3×33 \times 33×3 的矩阵中的卡片状态如下:
| A | B | B |
|---|---|---|
| A | B | A |
| B | A | B |
选择第二行第二列的那张 B 面卡片,翻转为 A 面,可以使翻转后四个方向相连的 A 面卡片最多,为 555 张。
| A | B | B | A | B | B | |
|---|---|---|---|---|---|---|
| A | B | A | →\rightarrow→ | A | A | A |
| B | A | B | B | A | B |
输入格式
第一行输入一个正整数 NNN(2≤N≤502 \leq N \leq 502≤N≤50),表示矩阵的行数和列数。
第二行开始输入 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 B4297 蓝桥杯青少年组国赛 2022 翻卡片&spm=1001.2101.3001.5002&articleId=148322342&d=1&t=3&u=d09ff84ba10e4cbd840a1ac2dcb00171)
3945

被折叠的 条评论
为什么被折叠?



