攀岩

题目描述

小明参加了一个攀岩比赛,他想知道从起点到终点有多少种走法。现在给你岩壁图,用1和0表示,其中1表示岩壁的那一处突出一块大石头,小明没办法从那里通过,0表示能够顺利爬过去。小明只能往左爬或往上爬。起点是在最右下角的岩壁旁的地面,小明只能从最右下角开始往岩壁上爬,终点是在最左上角的岩壁。
你现在需要写出一个程序统计出小明有多少种走法。

输入

第一行整数m和n,分别表示岩壁图的行数和列数,m和n的值均不超过100;
后面m行每行n个整数;

输出

一个整数,表示有多少种走法

示例

输入:
3 5
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
输出:
6

思路

利用动态规划。每一个网格都可以由该网格左边或上边的网格转移过来,因此到达某一点的路径数等于到达它上一点的路径数与它左边的路径数之和,当某个网格有障碍时,到达该网格的路径数是0。动态规划数组dp[i][j] = 起点到点(i, j)的路径总数。于是我们就得到递推关系式:当网格为0时,dp[i][j] = dp[i][j-1] + dp[i-1][j];当网格为1(说明该网格是障碍物),dp[i][j]=0。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int nums[101][101];
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>nums[i][j];
    long long dp[101][101];
    dp[0][0]=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(nums[i][j]==1)
                dp[i][j]=0;
            else
            {
                if(i) dp[i][j]+=dp[i-1][j];
                if(j) dp[i][j]+=dp[i][j-1];
            }
        }
    cout<<dp[n-1][m-1]<<endl;		
}

猜你喜欢

转载自blog.csdn.net/weixin_44010678/article/details/88291979