我感觉的我思路没什么问题,但是它不输出‘g’,而且第一行第一列不知道为什么'q'还保留了。???
/*染色的原样输出,不染色输出*
找出所有起点位置,存入数组一个个处理
从起点坐标开始,找出下一个字母的方向,坐标+方向+深度传入DFS
DFS中如果下一个方向没有对应的单词,回溯;有就调下一个DFS
如果搜索到最后一个单词,用循环给经过的所有路程坐标染色*/
#include<iostream>
#include<vector>
using namespace std;
int n;
char mp[1050][1050]; //单词方阵
bool vis[1050][1050]; //染色图
int dirx[8]={1,1,0,-1,-1,-1,0,1}; //右边开始顺时针8个方向
int diry[8]={0,1,1,1,0,-1,-1,-1};
string word="yizhong";
struct AXI{
int x,y;
}ax;
vector<AXI> ve; //存入所有的起点坐标
void DFS(int x,int y,int dx,int dy,int dep){ //2个坐标+2个方向+深度
if(dep==8){ //深度够了
for(int i=1;i<=7;i++){ //给前边的路程染色
vis[x-i*dx][y-i*dy]=true;
}
return ;
}
int tx=x+dx;
int ty=y+dy;
if(tx<1||ty<1||tx>n||ty>n){ //超出边界
return ;
}
if(mp[tx][ty]==word[dep-1]){ //满足就下一层
DFS(tx,ty,dx,dy,dep+1);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){ //存入所有起点坐标
for(int j=1;j<=n;j++){
if(mp[i][j]=='y'){
ax.x=i;
ax.y=j;
ve.push_back(ax);
}
}
}
for(int i=0;i<ve.size();i++){
for(int j=0;j<8;j++){
int tx=ve[i].x+dirx[j];
int ty=ve[i].y+diry[j];
if(tx<1||ty<1||tx>n||ty>n){ //超出边界
continue;
}
if(mp[tx][ty]=='i'){
DFS(tx,ty,dirx[j],diry[j],3);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==true){
cout<<mp[i][j];
}else{
cout<<"*";
}
}
cout<<endl;
}
return 0;
}