1. 程式人生 > >HDU - 5706 - Girlcat - 簡單搜索 - 有新手都可以看懂的詳解

HDU - 5706 - Girlcat - 簡單搜索 - 有新手都可以看懂的詳解

枚舉 下標 分享 sizeof hdu sgi href stream show

原題鏈接:

大致題意:給你一個二維字符串,可以看成圖;再給兩個子串“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 ; }
View Code

HDU - 5706 - Girlcat - 簡單搜索 - 有新手都可以看懂的詳解