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 } 

 



 

你可能感兴趣的:(du)