题目描述
小蓝在玩翻卡片游戏,每张卡片一面写着大写字母“A”,另一面写着大写字母“B”。首先将卡片排成一个N*N的矩阵。有的卡片是A面朝上,有的卡片是B面朝上。
现给定N的值,及N*N矩阵中每张卡片的状态,请你帮助小蓝挑选一张B面的卡,翻转成A面,使得翻转后的上、下、左、右四个方向相连的A面卡片最多,并将相连最多的卡片数量输出。
输入
第一行输入一个正整数N(2≤N≤50),表示矩阵的行数和列数
第二行开始输入N行,每行输入N个字符(‘A’或者‘B’),表示矩阵中卡片状态,字符之间以一个空格隔开
输出
输出一个整数,表示翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数
#include <iostream>
#include <cstring>
using namespace std;
const int N = 57;
const int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
char a[N][N];
int n, ans, mx;
bool vis[N][N];
void dfs(int x, int y) {
ans++;
vis[x][y] = true;
for (int i = 0; i < 4; i++) {
int xx = x+dx[i], yy = y + dy[i];
if (xx<1 || xx>n || yy<1 || yy>n || a[xx][yy]=='B' || vis[xx][yy])
continue;
dfs(xx, yy);
}
}
int main() {
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);
ans = 0;
dfs(i, j);
mx = max(mx, ans);
}
printf("%d", mx);
return 0;
}