# [蓝桥杯 2020 省 AB1] 走方格
## 题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 $1$ 至第 $n$ 行,从左到右依次为第 $1$ 至第 $m$ 列,每一个点可以用行号和列号来表示。
现在有个人站在第 $1$ 行第 $1$ 列,要走到第 $n$ 行第 $m$ 列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
## 输入格式
输入一行包含两个整数 $n$,$m$。
## 输出格式
输出一个整数,表示答案。
## 样例 #1
### 样例输入 #1
```
3 4
```
### 样例输出 #1
```
2
```
## 提示
$1\le n,m\le30$。
蓝桥杯 2020 第一轮省赛 A 组 G 题(B 组 H 题)。
思路
dfs暴力求解
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans;
void dfs(int x,int y){
if(x==n&&y==m)ans++;
if(x%2==0&&y%2==0)return ;
if(x<=n)dfs(x+1,y);
if(y<=m)dfs(x,y+1);
}
signed main(){
cin>>n>>m;
int a[n+10][m+10];
dfs(1,1);
cout<<ans;
}
暴力拿了60分,接下来是优化时间
于是加入了记忆化数组
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,mem[100][100];
int dfs(int x,int y){
if(x>n||y>m)return 0;
if(x==n&&y==m)return 1;
if(x%2==0&&y%2==0)return 0;
if(mem[x][y]!=-1)return mem[x][y];
int ans=dfs(x+1,y)+dfs(x,y+1);
return mem[x][y]=ans;
}
signed main(){
memset(mem,-1,sizeof(mem));
cin>>n>>m;
int a[n+10][m+10];
cout<<dfs(1,1);
}
AC通过~