我计算出来怎么是 5251 个号码
递归法:- #include <stdio.h>
- static const int maps[10][4] = { { 8, -1, -1, -1 } // 0
- , { 2, 4, -1, -1 } // 1
- , { 1, 3, 5, -1 } // 2
- , { 2, 6, -1, -1 } // 3
- , { 1, 5, 7, -1 } // 4
- , { 2, 4, 6, 8 } // 5
- , { 3, 5, 9, -1 } // 6
- , { 4, 8, -1, -1 } // 7
- , { 0, 5, 7, 9 } // 8
- , { 6, 8, -1, -1 } // 9
- };
- int foo( int v, int n )
- {
- if( v == -1 )
- return 0 ;
- if( n == 8 )
- return 1;
- return foo( maps[v][0], n+1 )
- + foo( maps[v][1], n+1 )
- + foo( maps[v][2], n+1 )
- + foo( maps[v][3], n+1 );
- }
- int main()
- {
- printf( "%d\n", foo(8,0) );
- return 0;
- }
复制代码 遍历法:- #include <stdio.h>
- int main()
- {
- static const int maps[10][4] = { { 8, -1, -1, -1 } // 0
- , { 2, 4, -1, -1 } // 1
- , { 1, 3, 5, -1 } // 2
- , { 2, 6, -1, -1 } // 3
- , { 1, 5, 7, -1 } // 4
- , { 2, 4, 6, 8 } // 5
- , { 3, 5, 9, -1 } // 6
- , { 4, 8, -1, -1 } // 7
- , { 0, 5, 7, 9 } // 8
- , { 6, 8, -1, -1 } // 9
- };
- // 0 1 2 3 4 5 6 7 8
- int num[9] = { 8, 0, 8, 0, 8, 0, 8, 0, 8 };
- size_t count = 1;
- for( size_t i=8; i!=0; --i )
- {
- char cur = num[i];
- char pre = num[i-1];
- for( size_t j=0; j<4; ++j )
- {
- if( maps[pre][j] > cur )
- {
- cur = maps[pre][j];
- break;
- }
- }
- if( cur != num[i] )
- {
- num[i] = cur;
- for( ; i<8; ++i )
- num[i+1] = maps[num[i]][0];
- ++count;
- for( size_t k=0; k<8; ++k )
- printf( "%d", num[k+1] );
- printf( "\n" );
-
- i = 9;
- continue;
- }
- }
- printf( "%u\n", (unsigned)count );
- return 0;
- }
复制代码 我还想用小白说的“动态规划”,不过,代码难写了点,算了 |