题意:在8个方向上,如果存在一个读的顺序使得这个方向上读的连续字符的顺序为yizhong,那么这个方向所对应字符串就不用*替代;
但是注意两点1.存在字符共用。2.只能在一个方向存在联系的yizhong,不能拐弯;
因为这道题数据很小,所以直接两个for+一个dfs就AC了;
AC代码:
#include<bits/stdc++.h>
using namespace std;
char Map[101][101];
int book[101][101];
int n;
int dir[][2]={
{
0,-1},{
1,-1},{
1,0},{
1,1},{
0,1},{
-1,1},{
-1,0},{
-1,-1}};
bool OK(int x,int y){
return x>=0&&x<n&&y>=0&&y<n;
}
struct Node{
int x,y;
Node(int xx,int yy){
x=xx;
y=yy;
}
};
vector<Node> V;
void dfs(int xx,int yy,int dx,int dy,char c){
//当前c字符的坐标和枚举的方向
int x=xx+dx,y=yy+dy;
if(c=='i'){
if(Map[y][x]=='z'){
V.push_back(Node(x,y));
dfs(x,y,dx,dy,'z');
V.pop_back();
}
}else if(c=='z'){
if(Map[y][x]=='h'){
V.push_back(Node(x,y));
dfs(x,y,dx,dy,'h');
V.pop_back();
}
}else if(c=='h'){
if(Map[y][x]=='o'){
V.push_back(Node(x,y));
dfs(x,y,dx,dy,'o');
V.pop_back();
}
}else if(c=='o'){
if(Map[y][x]=='n'){
V.push_back(Node(x,y));
dfs(x,y,dx,dy,'n');
V.pop_back();
}
}else if(c=='n') {
if(Map[y][x]=='g'){
V.push_back(Node(x,y));
for(int i=0;i<V.size();i++){
//这个方向的yizhong坐标标记为1
book[V[i].y][V[i].x]=1;
}
V.pop_back();
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",&Map[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(Map[i][j]=='y'){
V.push_back(Node(j,i));
for(int k=0;k<8;k++){
//枚举从y开始的8个方向,确定i之后才能确定dfs那个方向
int xx=j+dir[k][0],yy=i+dir[k][1];
if(OK(xx,yy)){
if(Map[yy][xx]=='i'){
V.push_back(Node(xx,yy));
dfs(xx,yy,dir[k][0],dir[k][1],'i');//确定遍历方向
V.pop_back();
}
}
}
V.pop_back();
}
}
}
for(int i=0;i<n;i++){
//输出答案
for(int j=0;j<n;j++){
if(!book[i][j]){
printf("*");
}else printf("%c",Map[i][j]);
}
puts("");
}
return 0;
}