【走方格】
题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 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);
}
我接下来到蓝桥杯 比赛这段时间尽量每天做一道往年题目或者找到合适的发上来,一方面监督自己,一方面求大佬指正,希望一起进步一起学习哈!!!