hdu 5706 girlcat
一道典型的深搜题目。
看代码的时候顺便体会深搜的含义,才能更熟练。
#include<iostream>//hdu 5706 深搜
#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
#define N 1010
char str[N][N];
char s1[] = "girl";
char s2[] = "cat";
int m, n, sum, num, k, p;
void dfsgirl(int i, int j, int k)
{
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 + 1, j, k + 1);
dfsgirl(i, j + 1, k + 1);
dfsgirl(i, j - 1, k + 1);
}
}
return;
}
void dfscat(int i, int j, int k)
{
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 - 1, j, k + 1);
dfscat(i, j + 1, k + 1);
dfscat(i, j - 1, k + 1);
}
}
return;
}
int main()
{
int t;
cin >> t;
while (t--)
{
sum = 0;
num = 0;
k = 0, p = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> str[i];
for(int i=0;i<n;i++)
for (int j = 0; j < m; j++)
{
if (str[i][j] == 'g')//深搜起点
dfsgirl(i, j, 0);
if (str[i][j] == 'c')
dfscat(i, j, 0);
}
cout << sum << " " << num << endl;
}
return 0;
}