这是本蒟蒻的第一篇题解
不喜勿喷
题目描述·简:
给定一个矩阵,有上下左右斜向共八个方向,要求找出所有的从每一个“y”出发,往某个方向遍历,直到连续地遍历完“yizhong”每个字母的路径。
简单的搜索题。
代码如下:
1 #include<bits/stdc++.h>
2 using namespace std;
3 char a[105][105],b[105][105],yz[10]={"nyizhong"};
4 int n;
5 int dx[12]={0,-1,0,1,-1,1,-1,0,1};//表示八个方向
6 int dy[12]={0,-1,-1,-1,0,0,1,1,1};
7 int dfs(int x,int y,int num,int direct){
8 int flag=1;//用于返回有无找到整个"yizhong"
9 int xx=x+dx[direct],yy=y+dy[direct];//走一步
10 if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[xx][yy]==yz[num+1]){//不出格,满足条件
11 if(num==6)//满 7,即找完"yizhong"
12 b[xx][yy]='c',flag=0;//终点没遍历到,提前标c
13 else if(!dfs(xx,yy,num+1,direct))//返回值!=0表示满 7,标c,退出循环
14 b[xx][yy]='c',flag=0;//注意flag要置为零,因为每层flag初始值都为 1
15 }
16 if(!flag&&a[x][y]=='y') b[x][y]='c'; //因为这个函数是从y的下一个字母开始的,所以特判 y
17 return flag;
18 }
19 int main(){
20 scanf("%d",&n);
21 memset(b,'b',sizeof(b));//字符数组的memset 设置为b以便判断输出
22 for(int i=1;i<=n;i++){
23 scanf("%s",a[i]+1);
24 getchar();//注意吃空格
25 }
26 for(int i=1;i<=n;i++)
27 for(int j=1;j<=n;j++)
28 if(a[i][j]=='y')//从 y开始dfs
29 for(int k=1;k<=8;k++)//八个方向,都是单调方向,所以不在dfs()中循环
30 dfs(i,j,1,k);//k表示方向,1表示当前寻找的是"yizhong"中的第几个字母
31 for(int i=1;i<=n;i++){
32 for(int j=1;j<=n;j++)
33 if(b[i][j]!='b') printf("%c",a[i][j]);
34 else printf("*");
35 printf("\n");
36 }
37 return 0;
38 }