马踏棋盘算法(骑士周游问题)
生活随笔
收集整理的這篇文章主要介紹了
马踏棋盘算法(骑士周游问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要求:
國家棋盤為8*8的方格棋盤,將"馬"放在任意指定方格中。最終讓馬走遍64個方格。
關于象棋中馬的走法
如下圖所示:
下面是代碼:
#include <stdio.h> #include <time.h> #include <Windows.h>#define X 8 #define Y 8int 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) //3這個位置{*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_s("%2d\t", chess[i][j]);}printf_s("\n");}printf_s("\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++;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);}}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_s("馬踏棋盤失敗\n");}finish = clock();printf_s("\n本次計算一共耗時: %f秒\n\n", (double)(finish - start) / CLOCKS_PER_SEC);system("pause");return 0; } 運行結構如下:
總結
以上是生活随笔為你收集整理的马踏棋盘算法(骑士周游问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt + opencv249配置转+续写
- 下一篇: C/C++无限关机(提权例子)