馬踏棋盤問題
阿新 • • 發佈:2018-12-25
/*關於馬踏棋盤的基本過程:國際象棋的棋盤為 8*8 的方格棋盤。現將"馬"放在任意指定的方格中, 按照"馬"走棋的規則將"馬"進行移動。要求每個方格只能進入一次,最終使得"馬"走遍棋盤的64個方格。 */ #include <stdio.h> #include <time.h> #define X 8 #define Y 8 int chess[X][Y]; // 找到基於(x,y)位置的下一個可走的位置 int nextxy(int *x, int *y, int count) { switch(count) { case 0: if( *x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0 ) { *x = *x + 2; *y = *y - 1; return 1; } break; case 1: if( *x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0 ) { *x = *x + 2; *y = *y + 1; return 1; } break; case 2: if( *x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0 ) { *x = *x + 1; *y = *y - 2; return 1; } break; case 3: if( *x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2]==0 ) { *x = *x + 1; *y = *y + 2; return 1; } break; case 4: if( *x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0 ) { *x = *x - 2; *y = *y - 1; return 1; } break; case 5: if( *x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0 ) { *x = *x - 2; *y = *y + 1; return 1; } break; case 6: if( *x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0 ) { *x = *x - 1; *y = *y - 2; return 1; } break; case 7: if( *x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0 ) { *x = *x - 1; *y = *y + 2; return 1; } break; default: break; } return 0; } //列印棋盤格 void print() { int i, j; for( i=0; i < X; i++ ) { for( j=0; j < Y; j++ ) { printf("%2d\t", chess[i][j]); } printf("\n"); } printf("\n"); } // 深度優先遍歷棋盤 // (x,y)為位置座標 // tag是標記變數,每走一步,tag+1 int TravelChessBoard(int x, int y, int tag) { int x1=x, y1=y, flag=0, count=0; chess[x][y] = tag; // 如果tag==X*Y,則完成整個棋盤的遍歷 if( tag == X*Y ) { print(); return 1; } flag = nextxy(&x1, &y1, count);//判斷有沒有位置 while( 0==flag && count < 7 )//如果沒有且count<7就可以找其他的位置 ,直到找到,退出迴圈 { count++; flag = nextxy(&x1, &y1, count); } while( flag ) { if( TravelChessBoard(x1, y1, tag+1) )//使用遞迴,一條路走到黑 { return 1; } //如果上述遞迴一條路走到了死衚衕,就要採用下一條道路 x1 = x; y1 = y; count++; flag = nextxy(&x1, &y1, count); while( 0==flag && count < 7 ) { count++; flag = nextxy(&x1, &y1, count); } } //如果最後沒有道路可以走了,就將這次函式賦值的位置的值置為0,然後返回上次函式,接著下次的count繼續找 if( 0 == flag ) { chess[x][y] = 0; } return 0; } int main() { int i, j; clock_t start, finish; start = clock(); for( i=0; i < X; i++ ) { for( j=0; j < Y; j++ ) { chess[i][j] = 0; } } if( !TravelChessBoard(2, 0, 1) ) { printf("抱歉,馬踏棋盤失敗鳥~\n"); } finish = clock(); printf("\n本次計算一共耗時: %f秒\n\n", (double)(finish-start)/CLOCKS_PER_SEC); return 0; }