为什么第一个代码kk>k对改成==就错,而第二个代码kk==k对了,求助大佬
查看原帖
为什么第一个代码kk>k对改成==就错,而第二个代码kk==k对了,求助大佬
463562
Dreamerlee✅楼主2021/2/21 12:36
#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;
}
2021/2/21 12:36
加载中...