博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一组简单一点的题目(六) B - 小兔的棋盘
阅读量:5891 次
发布时间:2019-06-19

本文共 1015 字,大约阅读时间需要 3 分钟。

题目:B - 小兔的棋盘

小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!
Input
每次输入一个数n(1<=n<=35),当n等于-1时结束输入。
Output
对于每个输入数据输出路径数,具体格式看Sample。
Sample Input
1
3
12
-1
Sample Output
1 1 2
2 3 10
3 12 416024

思路:这个题要特别注意一下里面有个要求即不能越过对角线!,所以可以分开处理,即将其分成上半边和下半边。只需要求出一个半边,之后乘2即可。

这个题一开始我想进行组合来着,但是后来发现因为不能越过对角线,所以不可以进行组合,所以就用类似斐波那契数列进行,即每次到一个格子的的方式的数量由走到下一个格子和走到左一个格子的方式的数量之和。而对角线因为特殊所以要单独处理,即走到对角线的方式的数量仅有下边一个格子决定,每次都要算到(n,n),即每次循环存储的时候都要到(i,i);

新技巧:这个类斐波那契数列存数的方式早就接触到,但这个是一种可以用的情况,即行走的步数的问题,即从这里走怎么走到另一个问题,所以从每一步的种类数量由前一步还是前几步决定。

所以,总得来说就是,这种走路方式和数量的问题都可以尝试用类斐波那契数列处理,前提必须要有前后关系才行!!

代码:

#include
#include
using namespace std;long long a[37][37];int main(){ int i,j,n; memset(a,0,sizeof(a)); for(i=1;i<36;++i){ a[i][0]=1; for(j=1;j
> n&&n!=-1){ num++; cout << num << " " << n << " "<< 2*a[n][n] << endl; } return 0;}

转载地址:http://amfsx.baihongyu.com/

你可能感兴趣的文章
Hive简介
查看>>
安装uwsgi
查看>>
Linux网络编程的一般步骤(1)
查看>>
新项目
查看>>
jquery创建并行对象或者叫合并对象
查看>>
PHP简单分页方法。适合重写url、普通传参
查看>>
MFC菜鸟学编程——第一篇
查看>>
CentOS上MySQL安装配置操作说明
查看>>
Scrapy爬取IT之家
查看>>
递归排序 冒泡排序 求子集
查看>>
hyper-v 无线网连接
查看>>
react中create-react-app配置antd按需加载(方法二)
查看>>
[原]OWC做电子表格和图表的试验
查看>>
TSP 模拟退火
查看>>
im2rec 修改resize
查看>>
NOI2007 生成树计数
查看>>
第四十二课:基于CSS的动画引擎
查看>>
学习无符号整型和有符号整型数的范围
查看>>
LeetCode 10. Regular Expression Matching
查看>>
xgboost: 速度快效果好的boosting模型
查看>>