【不可思议算法】一个N*N的方格,从左上到右下,总共有多少种走法

一个N*N的方格,从左上到右下,总共有多少种走法,不重复经过同一交点。

先看几个视频:

[不可思议的计算法]和大姐姐一起来计算! - 嗶哩嗶哩 - ( ゜- ゜)つロ 乾杯~ - bilibili.tv

还记得那个数方格的大姐姐么 - 嗶哩嗶哩 - ( ゜- ゜)つロ 乾杯~ - bilibili.tv

那些你所不知道的数字单位 - 嗶哩嗶哩 - ( ゜- ゜)つロ 乾杯~ - bilibili.tv

 

用最笨的搜索与回溯

(大写的N的值对应方格的边长,下面的代码N=5即是5*5的方格)

#include <fstream>

const int N = 5 , n = N + 1  , m = n + 2 ;
int way[20] = { 0 } ; void wpp( int lev ) { ++way[ lev ]; if ( way[ lev ] == 10000 ) { way[ lev ] = 0 ; wpp( lev + 1 ) ; } } void path( bool grid[20][20] , int i , int j , int dir ) { if ( dir == 1 ) ++j ; else if ( dir == 2 ) ++i ; else if ( dir == 3 ) --j ; else --i ; if ( grid[i][j] ) return ; if ( i == n && j == n ) { wpp(1) ; wpp(1) ; return ; } grid[i][j] = true ; path( grid , i , j , 1 ) ; path( grid , i , j , 2 ) ; path( grid , i , j , 3 ) ; path( grid , i , j , 4 ) ; grid[i][j] = false ; return ; } int main() { int i = 1 , j = 1 ; bool grid[20][20] = {false} ; for ( int a = 0 ; a != m ; ++a ) { grid[0][a] = true ; grid[m-1][a] = true ; grid[a][0] = true ; grid[a][m-1] = true ; } grid[i][j] = true ; path( grid , i , j , 1 ) ; printf( "%dx%d\n" , N , N ) ; int bit = 19 ; for ( ; ! way[ bit ] ; --bit ) ; printf( " %4d" , way[ bit-- ] ) ; while ( bit != 0 ) printf( " %04d" , way[ bit-- ] ) ; }

 

 

 

posted @ 2013-05-21 01:04  活在二次元的伪触  阅读(1670)  评论(0编辑  收藏  举报