ACM PKU 3984 http://poj.org/problem?id=3984 迷宫问题

  这是本人离开集训队两年后又回来做的第一道题,因为研究生阶段学的是计算机软件与理论,另外现在在学C++的精髓,想做点题来充实一下,检测自己学的怎么样。迷宫问题很简单,是我随意看到的一道题,看见有兴趣就写了一下,这样的题写了差不多一个小时,也是这段时间没有训练的原因吧。

  这题我最初的思想是想用我师父的无敌递归写的,但是题目中有一个关于找最小,而且要打印路径的问题用简单递归很棘手,有很大可能是我的递归火候不足,没有师父那么炉火纯青。想了几分钟也没有想到更好的方法,上了个厕所回来还是走了我之前的专攻方法DP,用的是记忆搜索,写代码也就是几分钟的事了。

  废话说的有点多,还是解析一下代码,写一下结题报告吧。

 
  
1 #include < iostream >
2   using namespace std;
3
4   int Rec[ 5 ][ 5 ];
5
6 int weight[ 5 ][ 5 ];
7
8 int get_Min( int i , int j) //关键在这里了,用于找到最优路径,一个递归搞定;
9 {
10 if ( Rec[i][j] || i < 0 || j < 0 || i > 4 || j > 4 ) return 0xffff ;
11 if (i == 0 && j == 0 )
12 {
13 weight[i][j] = 1 ;
14 return weight[i][j];
15 }
16 else
17 {
18 weight[i][j] = get_Min(i,j - 1 ) > get_Min(i - 1 ,j) ? get_Min(i - 1 ,j) + 1 : get_Min(i,j - 1 ) + 1 ;
19 return weight[i][j];
20 }
21 }
22
23 void print( int i, int j) //打印函数,也是一个递归搞定;
24 {
25 if (i == 0 && j == 0 )
26 {
27 printf( " (%d, %d)\n " ,i,j);
28 return ;
29 }
30 else if ( 1 == weight[i][j] - weight[i - 1 ][j])
31 {
32 print(i - 1 ,j);
33 printf( " (%d, %d)\n " ,i,j);
34 }
35 else
36 {
37 print(i,j - 1 );
38 printf( " (%d, %d)\n " ,i,j);
39 }
40 }
41
42 int main()
43 {
44 int i = 0 ,j = 0 ;
45 memset(weight, 0 , sizeof (weight));
46 for (i = 0 ; i < 5 ; i ++ )
47 for (j = 0 ; j < 5 ; j ++ )
48 scanf( " %d " , & Rec[i][j]);
49 get_Min( 4 , 4 );
50 print( 4 , 4 );

51 return 0 ;
62 }

有什么问题可以通过QQ或者是Email联系我。

转载于:https://www.cnblogs.com/Chinese-Coder-Clarence/articles/2064747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值