原题链接:
大致题意:给你一个二维字符串,可以看成图;再给两个子串“girl”和“cat”,求图中任意起点开始的不间断连接起来的字母构成的两个子串的分别的个数;连接的方向只有不间断的上下左右。
搜索函数:
void dfsgirl(int i, int j,int k);
//第一层(i1,j1, k=0)时,k=0表示(i1,j1)上是g,然后枚举四个方位找到i——进入第二层
//第二层(i2,j2, k=1)时,k=1表示(i2,j2)位置上是字母i(并且该位置与i1,j1相邻,这是为什么?),然后枚举四个方位找到r——进入第三层
//第三层(i3,j3,k=2),k=2表示(i3,j3)位置上是字母r(并且该位置与i2,j2相邻,为什么?)然后枚举四个方位找到l——进入第四层
//第四层(i4,j4,k=3),找到l就要停下来了,直接记录结果并范围上一层,接着执行下一个方位的dfs。(为什么这时可以停下了呢?因为dfs都是环环相扣的,前面的解都是合理的,然后推出后面的解;再后面的解以此为基础,再往下搜索!)
void dfscat(int i, int j,int k);
道理同上,自己照葫芦画瓢可以写写就懂得差不多了。
//main函数里确保了每个起点不同,并且每个字符串不是回文字符串,所以确保不会走重复的!自己举个栗子试试!
//再看不懂就直接去动手画画推推好了,或者调试吧!单步调试可以清晰直接地看出机器的逻辑!
没有思路就不要盲目做题。抄代码是一种不好的习惯,代码如下:
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; void dfscat(int i, int j,int k); void dfsgirl(int i, int j,int k); #define N 1010 char str[N][N]; char s1[]= "girl"; //声明需要查找的字符串 char s2[]= "cat"; int m,n,sum,num,k,p; int main() { int T,i,j; scanf("%d",&T); while(T--) { sum=0; //girl的数量 num=0; //cat的数量 k=0; p=0; memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0; i<n; i++) //存贮一整个图 scanf("%s",str[i]); for(i=0; i<n; i++) for(j=0; j<m; j++) { if(str[i][j]==‘g‘) dfsgirl(i,j,0); if(str[i][j]==‘c‘) dfscat(i,j,0); } printf("%d %d",sum,num); printf("\n"); } return 0; } //第一层(i1,j1,k=0)时,k=0表示(i1,j1)上是g,然后枚举四个方位找到i——进入第二层 //第二层(i2,j2,k=1)时,k=1表示(i2,j2)位置上是字母i(并且该位置与i1,j1相邻,这是为什么?),然后枚举四个方位找到r——进入第三层 //第三层(i3,j3,k=2),k=2表示(i3,j3)位置上是字母r(并且该位置与i2,j2相邻,为什么?)然后枚举四个方位找到l——进入第四层 //第四层(i4,j4,k=3),找到l就要停下来了,直接记录结果并范围上一层,接着执行下一个方位的dfs。(为什么这时可以停下了呢?因为dfs都是环环相扣的,前面的解都是合理的,然后推出后面的解;再后面的解以此为基础,再往下搜索!) //main函数里确保了每个起点不同,并且每个字符串不是回文字符串,所以确保不会走重复的!自己举个栗子试试! //再看不懂就直接去动手画画推推好了,或者调试吧!单步调试可以清晰直接地看出机器的逻辑! void dfsgirl(int i, int j,int k) //k表示当前步要搜索s1[4]=“girl”的下标 { if(i<0||j<0||i>=n||j>=m) return; else { if(str[i][j]==s1[k]) { if(k==3) //找到最后一个字母 { sum++; return ; } dfsgirl(i-1,j,k+1); dfsgirl(i,j-1,k+1); dfsgirl(i+1,j,k+1); dfsgirl(i,j+1,k+1); } } return ; } void dfscat(int i, int j,int k) ////k表示当前步要搜索s2[3]=“cat”的下标 { if(i<0||j<0||i>=n||j>=m) return; else { if(str[i][j]==s2[k]) { if(k==2) //找到最后一个字母 { num++; return ; } dfscat(i-1,j,k+1); dfscat(i,j-1,k+1); dfscat(i+1,j,k+1); dfscat(i,j+1,k+1); } } return ; }