这是本蒟蒻的第一篇题解

不喜勿喷


题目描述·简:

给定一个矩阵,有上下左右斜向共八个方向,要求找出所有的从每一个“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 }
01-26 21:58