zoukankan      html  css  js  c++  java
  • ybt1196踩方格

    ybt1196 踩方格

    【题目描述】

    有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

    a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

    b、走过的格子立即塌陷无法再走第二次;

    c、只能向北、东、西三个方向走;

    请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

    【输入】

    允许在方格上行走的步数n(n≤20)。

    【输出】

    计算出的方案数量。

    【输入样例】

    2
    

    【输出样例】

    7
    

    分析题目,可知本题的行走规则和过河卒相似,但路径不能重走

    先看方向,设上北下南左西右东,则只能往前左右走

    很容易知道,n=1时,答案为3。

    那么当n=2的时候,就可以把问题分成三部分:

    第一步朝上走,可以近似的看成在新起点上随便走一步,有3种情况,

    第一步朝左走,可以近似的看成在新起点上禁止往右走,有2种情况,

    同理,第一步往右走,也是两种情况,那么n=2时,就是7种情况。

    设n=i时,答案为f~i~,那么显然n=i时,第1步往上走会有f~i-1~种情况,那么只要正确求出第一步往左右的情况,答案就可求了。

    这里统称往左和往右为往侧面走。

    只走一步,有1一种情况;

    走2步,有两种情况;

    走3步,有5种情况(f~1~+2)

    ·········

    所以往侧面的路径可以理解为网络的总线结构,一条射线上每隔一个单位生出一个分支,越早生出的分支生长越大,这样就可以写出n=i时往侧面走的表达式:

    f~i-1~+f~i-2~+···+f~1~+2

    因为侧面包括左右,所以:

    f~i~=2(f~i-1~+f~i-2~+···+f~1~+2)+f~i-1~

    递推式写好了,边界条件也很明确:f~1~=3

    接下来就可以打代码了

    #include<iostream>
    using namespace std;
    int f[25],n;
    int main() {
    	f[0]=0;
    	f[1]=3;
    	cin>>n;
    	if(n==0) {//特判
    		cout<<0;
    		return 0;
    	}
    	for(int i=2;i<=n;i++) {
    		for(int j=i-2;j>=1;j--) {
    			f[i]+=2*f[j];//2*(f[i-1]+...+f[111])
    		}
    		f[i]+=f[i-1]+4;//2*2+f[i-1]
    	}
    	cout<<f[n]<<endl;
    	return 0;
    }
    
  • 相关阅读:
    集合合并
    非递减有序集合合并
    有序的双链表的实现
    单链表的实现
    构造有序的单链表
    约瑟夫环问题
    javaweb学习笔记
    Intellij IDEA快捷键
    JAVA:创建类和对象
    JAVA:成员变量和局部变量的区别
  • 原文地址:https://www.cnblogs.com/Wild-Donkey/p/12214387.html
Copyright © 2011-2022 走看看