这道题是很久之前A过的题,一道深搜嘛,不过我没有用深搜解(高举模拟大旗!!!!),也不是很难所以我就直接贴AC代码啦。
思路是这样的:循环遍历这个方阵,如果遇到y就接着一个方向往下找,然后如果找到了就用一个数组标记,最后输出就好了
#include<iostream> #include<cstring> #include<cstdio> using namespace std; long long n,xi=0,xj=0;//xi和xj的作用是储存每次变动后的x和y char s[1100][1100],ss[1100][1100];//一个是用来输入以及遍历的,一个是用来标记以及输出的 char a[7]={'i','z','h','o','n','g'};//这个数组是用来储存出现y之后应该判断的字符的 int dx[8]={-1,1,0,0,-1,1,-1,1};//dx和dy分别表示方向 int dy[8]={0,0,-1,1,-1,1,1,-1}; int ans=0; int main(){ cin>>n;//输入n for(int i=0;i<n;i++){//循环n*n次 for(int j=0;j<n;j++){ cin>>s[i][j];//输入方阵 ss[i][j]=s[i][j];//这个数组到后面要用来标记的 } } for(int i=0;i<n;i++){//循环n*n次,开始遍历 for(int j=0;j<n;j++){ if(s[i][j]=='y'){//判断当前字符是否等于y xi=i;//先储存一下当前的x和y xj=j;//也就是i和j啦,一会要用它去加dx和dy,确定新方向 for(int k=0;k<8;k++){//因为是一共可以有八个方向(上,下,左,右,左上,左下,右上,右下),所以循环8次 int q=1;//新建一个变量,是用来当作小旗子的 for(int k2=0;k2<6;k2++){//因为“yizhong”一共是7个字符,但我们已经判断了y了,所以只需要循环6次 int x=xi+dx[k];//每次都加一样的,他的7个字符一定得是同一方向的 int y=xj+dy[k];//举例:本来往右上方发展的,结果突然就拐了个弯,往左上发展了,这样是不正确的 if(x>=0&&y>=0&&x<n&&y<n&&s[x][y]==a[k2]){//判断当前x和y是否越界以及当前字符是否正确 xi=x;//如果全部符合条件,那么就储存下来 xj=y; } else{//否则 q=0;//小旗就等于零,表示他本次的探索是错误的 xi=i;//xi和xj也要返回初始的位置 xj=j;//也就是i和j break;//结束当前循环 } } if(q==1){//如果小旗等于1,表示本次探索正确 ss[xi][xj]='*';//标记数组把“yizhong”这个字符串所在的位置都标记上*号 ss[xi-dx[k]][xj-dy[k]]='*'; ss[xi-(dx[k]*2)][xj-(dy[k]*2)]='*'; ss[xi-(dx[k]*3)][xj-(dy[k]*3)]='*'; ss[xi-(dx[k]*4)][xj-(dy[k]*4)]='*'; ss[xi-(dx[k]*5)][xj-(dy[k]*5)]='*'; ss[xi-(dx[k]*6)][xj-(dy[k]*6)]='*'; } } } } } for(int i=0;i<n;i++){//最后输出 for(int j=0;j<n;j++){ if(ss[i][j]=='*') cout<<s[i][j];//如果标记数组这里是*号,也就是说这里是字符串“yizhong”的所在位置,那么就输出字母(s[i][j]) else cout<<"*";//否则,也就是说这里不是字符串“yizhong”的所在位置,直接输出*号就好了 } cout<<endl;//每输出一行就回一次车 } return 0;//不要忘了return 0喔 }