#include <iostream>
#include <cstdio>
using namespace std;
int to[3][3] = {{0,1},{1,0} };//两个方向的可以不需要vis判断动没动过
int r, c, k,ans;
char a[110][110];
void dfs(int x, int y,int kk,int x1,int y1)
{
if (kk > k)//这里改成==就错
{
++ans;
return;
}
if (a[x][y] == '.' && x >= 1 && x <= r && y >= 1 && y <= c)
dfs(x+x1, y+y1, kk + 1,x1,y1);
return;
}
int main()
{
cin >> r >> c >> k;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
cin >> a[i][j];
}
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
if (a[i][j] == '.')
{
for (int z = 0; z < 2; z++)
dfs(i, j, 1,to[z][0],to[z][1]);
}
}
}
if (k == 1)
ans /= 2;
cout << ans;
return 0;
}
第二个代码----------分割线----------------------
#include <iostream>
#include <cstdio>
using namespace std;
int to[5][3] = { {-1,0},{0,-1},{0,1},{1,0} };//四个方向,其实可以只要下和右两个方向
int r, c, k,vis[110][110],ans;
char a[110][110];
void dfs(int x, int y,int kk,int x1,int y1)
{
int xx, yy;
if (kk == k)//这里改成kk>k就错
{
++ans;
return;
}
xx = x + x1;//寻找下一个坐标的点
yy = y + y1;
if (a[xx][yy] == '.' && !vis[xx][yy] && xx >= 1 && xx <= r && yy >= 1 && yy <= c)
//如果坐标符合范围且下一个坐标的点之前没有用过,且下一个坐标的点是.就dfs再次寻找下一个
dfs(xx, yy, kk + 1,x1,y1);
return;
}
int main()
{
cin >> r >> c >> k;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
cin >> a[i][j];
}
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
if (a[i][j] == '.')//如果是.就进入循环,如果是#就退出
{
for (int z = 0; z < 4; z++)
{
vis[i][j] = 1;//标记这个点找过,以后的点再找到这个点就不行
dfs(i, j, 1,to[z][0],to[z][1]);
//i,j是当前坐标,to数组是移动方向
}
}
}
}
if (k == 1)
ans /= 4;//r=1时特判,只向下和右移动就/2,但这是向上下左右四个方向,每一个
//方向当k=1时就会多+1,所以需要/4
cout << ans;
return 0;
}