#include <stdio.h>
#include <stdbool.h>
#define MAXN 6 //矩阵的最大大小
//判断两个位置是否相邻,横向或竖向,含T/L/+型
bool isAdjacent(int x1, int y1, int x2, int y2) {
return (x1 == x2 && abs(y1 - y2) == 1) || (y1 == y2 && abs(x1 - x2) == 1);
}
//消除一个位置的图案,将其设为0
void eliminate(int matrix[MAXN][MAXN], int x, int y) {
matrix[x][y] = 0;
}
//判断是否可以消除,如果可以,就执行消除操作,并返回true;如果不可以,就返回false
bool canEliminate(int matrix[MAXN][MAXN], int n, int x, int y) {
int value = matrix[x][y]; //当前位置的图案
if (value == 0 || value == '#') return false; //如果是空或其他字符,不可消除
int count = 1; //记录相同图案的个数
int left = y - 1, right = y + 1, up = x - 1, down = x + 1; //记录左右上下的边界
//向左扩展,直到遇到不同的图案或边界
while (left >= 0 && matrix[x][left] == value) {
count++;
left--;
}
//向右扩展,直到遇到不同的图案或边界
while (right < MAXN && matrix[x][right] == value) {
count++;
right++;
}
//如果横向的个数满足消除条件,就消除这些位置
if (count >= n) {
for (int i = left + 1; i < right; i++) {
eliminate(matrix, x, i);
}
return true; //返回true表示可以消除
}
//否则,重置计数和边界,继续检查竖向
count = 1;
left = y, right = y, up = x - 1, down = x + 1;
//向上扩展,直到遇到不同的图案或边界
while (up >= 0 && matrix[up][y] == value) {
count++;
up--;
}
//向下扩展,直到遇到不同的图案或边界
while (down < MAXN && matrix[down][y] == value) {
count++;
down++;
}
//如果竖向的个数满足消除条件,就消除这些位置
if (count >= n) {
for (int i = up + 1; i < down; i++) {
eliminate(matrix, i, y);
}
return true; //返回true表示可以消除
}
//否则,返回false表示不可以消除
return false;
}
//检查是否消除成功,如果矩阵中没有非空的图案,就返回true;否则返回false
bool checkSuccess(int matrix[MAXN][MAXN]) {
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
if (matrix[i][j] != 0 && matrix[i][j] != '#') {
return false;
}
}
}
return true;
}
//输出结果,如果消除成功,就输出yes;否则输出最后的矩阵
void outputResult(int matrix[MAXN][MAXN]) {
if (checkSuccess(matrix)) {
printf("yes\n");
} else {
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
printf("%c ", matrix[i][j]);
}
printf("\n");
}
}
}
int main() {
int n; //消除的连续相同图案个数
int matrix[MAXN][MAXN]; //连连看矩阵
char c; //临时变量,用来读取字符
scanf("%d", &n); //输入n
//输入矩阵,用字符表示图案,#表示无图案
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
scanf(" %c", &c);
matrix[i][j] = c;
}
}
//遍历矩阵,尝试消除每个位置,直到不满足消除条件为止
bool flag = true; //标记是否有消除发生
while (flag) {
flag = false; //假设没有消除发生
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
//如果可以消除,就更新标记为true
if (canEliminate(matrix, n, i, j)) {
flag = true;
}
}
}
}
//输出结果
outputResult(matrix);
return 0;
}