题目链接:HDOJ 5706
题意:给定字符矩阵,每一处可向四个方向组单词,求能够组成"girl"和"cat"的单词数。
AC code:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define debug 1
const int maxn = 1000 + 5;
char data[maxn][maxn];
int n, m, ans1, ans2;
int dir[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool judge(int x, int y){ //边界判断
if(x < 1 || x > n || y < 1 || y > m)
return false;
return true;
}
void dfs1(int x, int y){
for(int i = 0; i < 4; i++){
int fx = x + dir[i][0];
int fy = y + dir[i][1];
if(judge(fx, fy)){
if(data[x][y] == 'g' && data[fx][fy] == 'i'){
dfs1(fx, fy);
}
if(data[x][y] == 'i' && data[fx][fy] == 'r'){
dfs1(fx, fy);
}
if(data[x][y] == 'r' && data[fx][fy] == 'l'){
ans1++;
}
}
}
}
void dfs2(int x, int y){
for(int i = 0; i < 4; i++){
int fx = x + dir[i][0];
int fy = y + dir[i][1];
if(judge(fx, fy)){
if(data[x][y] == 'c' && data[fx][fy] == 'a'){
dfs2(fx, fy);
}
if(data[x][y] == 'a' && data[fx][fy] == 't'){
ans2++;
}
}
}
}
int main()
{
freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
char a;
while(T--)
{
ans1 = ans2 = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
while((a = getchar()) == ' ' || a == '\n');
data[i][j] = a;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if(data[i][j] == 'g') //girl
{
dfs1(i, j);
}
if(data[i][j] == 'c') //cat
{
dfs2(i, j);
}
}
printf("%d %d\n", ans1, ans2);
}
return 0;
}