这是本人离开集训队两年后又回来做的第一道题,因为研究生阶段学的是计算机软件与理论,另外现在在学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 }
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联系我。