zoukankan      html  css  js  c++  java
  • HDU 2067 小兔的棋盘 (模拟)

    题目链接

    Problem Description

    小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(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`

    题目分析:

    对于一个n*n的方格,我们要考虑从它的左上角走到右下角,但是在走的过程中不能够穿越对角线,也就意味着在走的时候只能够向右或则向下走。同时为了优化代码的运行时间,我们还应该注意到,对于对角线来说,对于对角线右上的一条路径,我们总能够在对角线的左下找到一天对称的路径,所以我们只需要求出对角线一边的路径即可。

    现在我们要走从(0,0)点走到(n,n)点,我们先把此方格扩展第0行和第0列,我们以右上角为例。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int main()
    {	 
         long long int a[37][37]={0};
         a[0][0]=0;//[0][0]点为起始点,没有点数可以到达 
         for(int i=1;i<=35;i++)
         a[0][i]=1;//其余的第0行的每个点,都只能够是上一点向右走到达的,所以都仅有一条路径 
         for(int i=1;i<=35;i++)
         for(int j=i;j<=35;j++)//我们仅需要考虑上三角形即可 
         {
         	if(i==j)
         	a[i][j]=a[i-1][j];//对角线上的点,只能够是上面一个点向下走得到 
         	else
         	a[i][j]=a[i-1][j]+a[i][j-1];//其余的点则可以是上面(左面)的点向下(向右)走得到 
         }
        int n,num=0;
        while(~scanf("%d",&n)!=EOF&&n!=-1)
        {
        	num++;
        	printf("%d %d %lld
    ",num,n,2*a[n][n]);
        }
         return 0;
    }
  • 相关阅读:
    Django(app的概念、ORM介绍及编码错误问题)
    Django(完整的登录示例、render字符串替换和redirect跳转)
    Construct Binary Tree from Preorder and Inorder Traversal
    Single Number II
    Single Number
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Binary Tree Zigzag Level Order Traversal
    Recover Binary Search Tree
    Add Binary
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6729724.html
Copyright © 2011-2022 走看看