HDU-1208,Pascal's Travels

简介: HDU-1208,Pascal's Travels

Problem Description:


An n x n game board is populated with integers, one nonnegative integer per square. The goal is to travel along any legitimate path from the upper left corner to the lower right corner of the board. The integer in any one square dictates how large a step away from that location must be. If the step size would advance travel off the game board, then a step in that particular direction is forbidden. All steps must be either to the right or toward the bottom. Note that a 0 is a dead end which prevents any further progress.



Consider the 4 x 4 board shown in Figure 1, where the solid circle identifies the start position and the dashed circle identifies the target. Figure 2 shows the three paths from the start to the target, with the irrelevant numbers in each removed.

网络异常,图片无法展示
|



Figure 1

网络异常,图片无法展示
|



Figure 2


Input:


The input contains data for one to thirty boards, followed by a final line containing only the integer -1. The data for a board starts with a line containing a single positive integer n, 4 <= n <= 34, which is the number of rows in this board. This is followed by n rows of data. Each row contains n single digits, 0-9, with no spaces between them.


Output:


The output consists of one line for each board, containing a single integer, which is the number of paths from the upper left corner to the lower right corner. There will be fewer than 2^63 paths for any board.  


Sample Input:


4


2331


1213


1231


3110


4


3332


1213


1232


2120


5


11101


01111


11111


11101


11101


-1


Sample Output:


3


0


7


程序代码:


#include<stdio.h>
#include<string.h>
#define MAXN 50
char s[MAXN][MAXN];
int map[MAXN][MAXN];
long long dp[MAXN][MAXN];
int main()
{
  int n;
  while(~scanf("%d",&n)&&n!=-1)
  {
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++)
      scanf("%s",s[i]);
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        map[i][j]=s[i][j]-'0';
    dp[0][0]=1;
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
        if(map[i][j]!=0)
        {
          if(map[i][j]+i<n)
            dp[i+map[i][j]][j]+=dp[i][j];
          if(map[i][j]+j<n)
            dp[i][j+map[i][j]]+=dp[i][j];
        }
      }
    }
    printf("%lld\n",dp[n-1][n-1]);
  }
  return 0;
}


相关文章
|
6月前
|
Java
hdu-1513-Palindrome
hdu-1513-Palindrome
24 0
hdoj 1028/poj 2704 Pascal's Travels(记忆化搜索||dp)
有个小球,只能向右边或下边滚动,而且它下一步滚动的步数是它在当前点上的数字,如果是0表示进入一个死胡同。求它从左上角到右下角到路径数目。 注意, 题目给了提示了,要用64位的整数。
37 0
HDU 3506 Monkey Party(动态规划)
HDU 3506 Monkey Party(动态规划)
59 0
HDU 3506 Monkey Party(动态规划)
HDU 4632 Palindrome subsequence(动态规划)
HDU 4632 Palindrome subsequence(动态规划)
75 0
HDU 4632 Palindrome subsequence(动态规划)
LeetCode 118:杨辉三角 II Pascal's Triangle II
公众号:爱写bug(ID:icodebugs)作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note that the row index starts from 0. 在杨辉三角中,每个数是它左上方和右上方的数的和。
918 0
Leetcode 118:Pascal's Triangle 杨辉三角
118:Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
981 0
|
机器学习/深度学习
Uva - 12050 Palindrome Numbers【数论】
题目链接:uva 12050 - Palindrome Numbers   题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然后就得到是长度为多少的第几个的回文串了,有个细节注意的是, n计算完后要-1! 下面给出A...
838 0