深搜的一道题
#include <bits/stdc++.h>
using namespace std;
int n;
char a[101][101];
bool vis[101][101];
int mx[9]={0, -1, -1, 0, 1, 1, 1, 0, -1};
int my[9]={0, 0, 1, 1, 1, 0, -1, -1, -1};
int ans[8][3];
void dfs(int x, int y, char c, int dir)
{
if(c=='g'){
for(int i=1; i<=7; ++i){
int row=ans[i][1];
int col=ans[i][2];
vis[row][col]=true;
}
return;
}
if(c=='y'){
for(int i=1; i<=8; ++i){
int xx=x+mx[i];
int yy=y+my[i];
if(a[xx][yy]=='i'){
ans[2][1]=xx;
ans[2][2]=yy;
//朝第i个方向
dfs(xx, yy, 'i', i);
}
}
}
else if(c=='i'){
int xx=x+mx[dir];
int yy=y+my[dir];
if(a[xx][yy]=='z'){
ans[3][1]=xx;
ans[3][2]=yy;
dfs(xx, yy, 'z', dir);
}
}
else if(c=='z'){
int xx=x+mx[dir];
int yy=y+my[dir];
if(a[xx][yy]=='h'){
ans[4][1]=xx;
ans[4][2]=yy;
dfs(xx, yy, 'h', dir);
}
}
else if(c=='h'){
int xx=x+mx[dir];
int yy=y+my[dir];
if(a[xx][yy]=='o'){
ans[5][1]=xx;
ans[5][2]=yy;
dfs(xx, yy, 'o', dir);
}
}
else if(c=='o'){
int xx=x+mx[dir];
int yy=y+my[dir];
if(a[xx][yy]=='n'){
ans[6][1]=xx;
ans[6][2]=yy;
dfs(xx, yy, 'n', dir);
}
}
else if(c=='n'){
int xx=x+mx[dir];
int yy=y+my[dir];
if(a[xx][yy]=='g'){
ans[7][1]=xx;
ans[7][2]=yy;
dfs(xx, yy, 'g', dir);
}
}
}
int main()
{
scanf("%d", &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]=='y'){
ans[1][1]=i;
ans[1][2]=j;
//可以朝8个方向
dfs(i, j, 'y', 0);
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(vis[i][j]==false){
a[i][j]='*';
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%c", a[i][j]);
}
printf("\n");
}
return 0;
}