题目链接:First Step
知识点:直线dfs
直线dfs的意思是沿着一条路一直走到底,不会转弯。
这道题里面就是让你向右或者向下直线dfs。
向下dfs
void down(int x, int y)
{
if(满足结束条件)
{
做你要做的事情;
return;
}
int newx = x + dir[0][0], newy = y + dir[0][1];//向下
if (newx >= 0 && newx < n && newy >= 0 && newy < m && g[newx][newy] == '.')
{
做你要做的事情;
down(newx, newy);
}
}
向右dfs也是一样的写法。
在这类题里面,要对每一个点都进行dfs。(有点像岛屿问题。不过岛屿问题一般的dfs都是可以转弯的。) 因此要遍历一遍二维矩阵。
AC代码:
#include <iostream>
using namespace std;
const int N = 110;
char g[N][N];
int dir[2][2] = { {1,0},{0,1}};
int n, m, k;
int ans;
int cnt;
void down(int x, int y)
{
if (cnt == k - 1)
{
ans++;
return;
}
int newx = x + dir[0][0], newy = y + dir[0][1];//向下
if (newx >= 0 && newx < n && newy >= 0 && newy < m && g[newx][newy] == '.')
{
cnt++;
down(newx, newy);
}
}
void right(int x, int y)
{
if (cnt == k - 1)
{
ans++;
return;
}
int newx = x + dir[1][0], newy = y + dir[1][1];//向右
if (newx >= 0 && newx < n && newy >= 0 && newy < m && g[newx][newy] == '.')
{
cnt++;
right(newx, newy);
}
}
int main()
{
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> g[i][j];
//遍历每一个点
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (g[i][j] == '.')
{
down(i, j);
cnt = 0;
right(i, j);
cnt = 0;
}
}
}
if (k == 1) ans /= 2;
cout << ans;
}
注:在这道题里面,如果k等于1,那么向右和向下会重复计数,要除以2.