蓝桥杯大赛— —每日一题(6、走方格)

【走方格】
题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。才
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4
【样例输出】
2
【样例输入】
6 6
【样例输出】
0
【评测用例规模与约定】
对于所有评测用例,1≤n≤30,1≤m≤30。

【我的思路】
这道题其实对于递归理解的比较深刻的同学来说很简单,我中类型的题大眼一看就能想到用递归的方法来实现,可以将这个二维点阵存在一个二维数组里面,然后用数据结构里面的深度优先遍历的方法来实现,也可以直接用两个参数(key1,key2)来代表移动的位置,其实这也是深度优先遍历的思想,但是对于这题体来说,就算没学过数据结构对递归理解透彻的话也很容易想到用这种方法。
首先题中说当行数和列数都为偶数时不能进入,也就是key1和key2不能同时为偶数而且只能像右和向下移动,也就是你移动的位置key1<n并且key2<m,而且要记住如果n,m本来就都是偶数,那么就永远进不去该地方,所以就有0中方法。除此之外key1,key2分别加一用递归的方法最后就能求出结果,但是数目太大就很难求出来了,我感觉就算用其他的方法数目太大也很难了,就好比八皇后问题,如果换成10皇后就算是算法再优化也很难(对于我现在的水平来说是这样啊!)。

代码如下

#include<iostream>
using namespace std;

int num = 0;
void dfs(int n, int m, int key1, int key2);

int main()
{
	int n = 0, m = 0;
	cin >> n;
	cin >> m;
	dfs(n, m, 1, 1);
	cout << num << endl;
	return 0;
}

void dfs(int n, int m, int key1, int key2)
{
	if (n % 2 == 0 && m % 2 == 0)
	{
		num = 0;
		return;
	}
	if (key1 == n && key2 == m)//只有这一种情况才算到一回目标
	{
		num++;
		return;
	}
	if ((key1 % 2 == 0) && (key2 % 2 == 0))
	{
		return;
	}
	if (key1 > n || key2 > m)
	{
		return;
	}
	dfs(n, m, key1 + 1, key2);
	dfs(n, m, key1, key2 + 1);
}

我接下来到蓝桥杯 比赛这段时间尽量每天做一道往年题目或者找到合适的发上来,一方面监督自己,一方面求大佬指正,希望一起进步一起学习哈!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值