大致思路:首先我们可以遍历整个单词方阵,找到每一个y开头的地方,然后沿着这8个方向寻找i,如果找到了i,我们就可以沿着这个方向继续查找下去,在查找的过程中我们要保证下一个单词必须与“yizhong”里相应次序的单词相同。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char maze[110][110];
int n;
int dir[][2] = {{-1,-1}, {-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
bool vis[110][110];
char temp[] = "yizhong";
struct node{
int nx,ny;
}a[1010];
void DFS(node c[],int cur,int direct) {
if(cur == 7) {
for(int i = 0; i < cur; i++)
vis[c[i].nx][c[i].ny] = 1;
}
else {
int dx = c[cur].nx + dir[direct][0];
int dy = c[cur].ny + dir[direct][1];
if(maze[dx][dy] == temp[cur + 1] || cur == 6) {
c[cur + 1].nx = dx,c[cur + 1].ny = dy;
DFS(c,cur + 1,direct);
}
}
}
int main() {
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%s",maze[i]);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(maze[i][j] == 'y') {
int cnt = 0;
for(int k = 0; k < 8; k++) {
int dx = i + dir[k][0];
int dy = j + dir[k][1];
if(maze[dx][dy] == 'i') {
a[0].nx = i,a[0].ny = j;
a[1].nx = dx,a[1].ny = dy;
cnt = 1;
DFS(a,cnt,k);
}
}
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(vis[i][j]) printf("%c",maze[i][j]);
else printf("*");
}
printf("\n");
}
return 0;
}