SDUT 1570 C旅行

这道题是上学期的上机题,上学期完全看不懂什么意思,其实这个题就是个马拦过河卒的问题,但是我还是没思路。
water师父告诉我用动态规划可以做,无奈我太愚笨,让他讲了一遍才懂。

不过效率比water神用动态规划做的提高了15ms.
仰慕water神用DP做。要注意判断边界。

题目描述

Tom和Alice结婚一段时间了,感情非常好,一天他们相约去旅行,终点在遥远的地方。

地形是非常复杂的,路途是非常曲折的。但我们简化一下是一个矩阵。起点也就是他们家在矩阵的左下角,终点也就是他们要去的遥远的地方在右上角,矩阵行列的交点是他们可以驻足的地方,但是有的却是陷阱,他们是不能从那里通过的。Tom要听Alice的,只会往上或往右走,不往回走,直到终点。

       Alice要Tom提前算出从起点到终点一共有多少条路,可Tom不会啊,所以就找到你了,你是编程高手,希望你帮他解决这个问题,不然他们的婚姻就有危机了。

输入

    输入数据的第一行是两个正整数H,W(2 < H,W < 20),代表矩阵的高和宽。接下来是一个矩阵,共H行,每行W个元素,用空格隔开,元素取值只有0或1,0表示可以走,1表示是陷阱,数据保证位于起点和终点的元素肯定是0。

输出

    输出一个整数,即从起点到终点的路径数。

示例输入

5 5
1 1 1 1 0
0 0 1 1 0
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0

示例输出

2

View Code
 1 #include<stdio.h>
 2 int d[100][100];
 3 int a[100][100];
 4 int n,m;
 5 int main()
 6 {   
 7     int i,j;
 8     scanf("%d%d",&n,&m);
 9     for(i=1;i<=n;i++)
10         for(j=1;j<=m;j++)
11             scanf("%d",&a[i][j]);
12         d[n][1]=1;
13         for(i=n;i>=1;i--)
14             for(j=1;j<=m;j++)
15             {
16                 if(a[i][j]==1)
17             d[i][j]=0;
18     else if(j==1&&i<n)
19         d[i][j]=d[i+1][j];
20     else if(i==n&&j>1)
21         d[i][j]=d[i][j-1];
22     else if(i!=n&&j!=1&&a[i][j]!=1)
23                 d[i][j]=d[i][j-1]+d[i+1][j];
24             }
25     printf("%d\n",d[1][m]);
26     return 0;
27 } 


 
原文地址:https://www.cnblogs.com/timeship/p/2519803.html