[蓝桥杯][2020年第十一届真题第一场]走方格

在平面上有一些二维的点阵。


这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。


现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。


只能向右或者向下走。


注意,如果行号和列数都是偶数,不能走入这一格中。


问有多少种方案。


输入格式 输入一行包含两个整数 n,m。


输出格式 输出一个整数,表示答案。


数据范围 1≤n,m≤30

输入样例1: 3 4


输出样例1: 2

输入样例2: 6 6


输出样例2: 0

解题思路:dp往右下递推,如果当前位置x、y有一个不是偶数,那么他就可以从上或者从左边转移过来,否则这个点到不了,为0

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull; 
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
    
    
	inline LL read(){
    
    
		LL o=0,f=1;char c=getchar();
		while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}
		while(c>='0'&&c<='9'){
    
    o=o*10+c-'0';c=getchar();}
		return o*f;
	}
}using namespace IO;
//#############以上是自定义技巧(可忽略)########## 
const int N=1e4+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131;
int n,m;
int dp[N][N];
int main(){
    
    
	cin>>n>>m;
	dp[1][1]=1;
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=m;j++){
    
    
			if(i==1&&j==1)continue;
			if(i%2!=0||j%2!=0){
    
    //如果有一个不为偶数
				dp[i][j]+=dp[i-1][j];//可以从上面转移过来
				dp[i][j]+=dp[i][j-1];//可以从左边转移过来
			}else{
    
    //否则就进不来,为0
				dp[i][j]=0;
			}
		}
	}	
	cout<<dp[n][m]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43738764/article/details/109024023