悬关求助!!
查看原帖
悬关求助!!
881317
spessert楼主2024/3/29 12:44

我感觉的我思路没什么问题,但是它不输出‘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;
}

2024/3/29 12:44
加载中...