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联系我。

posted on 2011-05-31 15:45  _Clarence  阅读(201)  评论(0编辑  收藏  举报

导航