题目链接
题解:所给的单词“yizhong”,只会在一行,一列,一斜上出现,所以我们找到矩阵中为y的点,对该点进行dfs,共有八个方向,然后在可能出现“yizhong”的一行或一列或一斜中判断即可,用另一个数组存取答案。
code:
#include<bits/stdc++.h>
using namespace std;
int n;
char a[120][120];
char b[120][120];
const string tt = "yizhong";
int dir[8][2] = { 1,0,-1,0,0,1,0,-1,1,1,-1,-1,1,-1,-1,1 };//方向数组
int check(int x, int y) {
if (x >= 1 && x <= n && y >= 1 && y <= n) return 1;//判断是否越界
return 0;
}
void dfs(int x, int y) {
int xx, yy, nx, ny;
for (int i = 0; i < 8; i++) {
int flag = 0;
for (int j = 1; j <= 6; j++) {
xx = x + j * dir[i][0];//对该方向进行拓展
yy = y + j * dir[i][1];
if (!check(xx, yy)) {
flag = 1;
break;
}
if (tt[j] != a[xx][yy]) {//依次比较,不符合就跳出
flag = 1;
break;
}
}
if (flag == 0) {//如果该组符合条件
for (int j = 0; j <= 6; j++) {
nx = x + j * dir[i][0];
ny = y + j * dir[i][1];
b[nx][ny] = a[nx][ny];
}
}
}
return;
}
int main() {
cin >> n;
memset(b, 0, sizeof(b));
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] == 'y') dfs(i, j);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (b[i][j] == 0) b[i][j] = '*';
cout << b[i][j];
}
cout << endl;
}
}