题目:
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m列。
只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
输入格式输入一行包含两个整数 n,m 。
输出格式输出一个整数,表示答案。
数据范围1≤n,m≤30
输入样例1:20 21
输出样例1:92378
思路:
用dfs遍历每一个点
对特殊情况特殊处理:
1.如果行号和列数都是偶数,不能走入这一格中。
2.行动所在的行数超出N或者列数超出M
(原因:只能往下和往右边动,一旦超过就无法到达终点)
然后每次遍历到达了就方案数加1
代码详解:
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
#include<algorithm>
#include<cmath>
ll sum=0,N,M;
struct fx
{
int x;
int y;
}around[]={{0,1},{1,0}};//定义结构体,向右边走和向下走
void dfs(int n,int m)
{
if(n==N&&m==M) //判断是否到达终点
{
sum++;
}
for(int i=0;i<=1;i++)//向右边走以及向下走
{
int dx=n+around[i].x;//更新走的方向
int dy=m+around[i].y;//更新走的方向
if(dx>N||dy>M||(dx%2==0&&dy%2==0)) continue;//当超出界限以及该位置n和m都为n时返回
else
dfs(dx,dy); //递归,进行下一步
}
}
int main()
{
cin>>N>>M;
dfs(1,1);
cout<<sum;//输出结果
return 0;
}