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;
}


相关文章
|
7月前
|
算法
poj 1159 Palindrome(最长公共子串)
关于求最长公共子串, 用到的是动态规划
18 0
HDU 3506 Monkey Party(动态规划)
HDU 3506 Monkey Party(动态规划)
46 0
HDU 3506 Monkey Party(动态规划)
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. 在杨辉三角中,每个数是它左上方和右上方的数的和。
889 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 行。
956 0
Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
H. Special Palindrome time limit per test:1 second memory limit per test:64 megabytes input:standard input output:standard o...
899 0
Uva - 12050 Palindrome Numbers【数论】
题目链接:uva 12050 - Palindrome Numbers   题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然后就得到是长度为多少的第几个的回文串了,有个细节注意的是, n计算完后要-1! 下面给出A...
818 0