C++實現(xiàn)騎士走棋盤算法
本文實例為大家分享了C++實現(xiàn)騎士走棋盤算法的具體代碼,供大家參考,具體內容如下
1.問題描述
騎士旅游Knight tour在十八世紀初倍受數(shù)學家與拼圖迷的注意,它什么時候被提出已不可考,騎士的走法為西洋 棋的走法,騎士可以由任一個位置出發(fā),它要如何走完所有的位置。
2.基本思路
騎士的走法,基本上可以用遞回來解決,但是純粹的遞回在維度大時相當沒有效率,一個聰明的解法由J.CWarnsdorff 在1823年提出, 簡單地說,先將最難的位置走完,接下來的路就寬廣了,騎士所想要的下一步,為下一不再 選 擇時,所能走的步數(shù)最少的一步。使用這個方法,在不使用遞回的情況下,可以有較高的機率找出走法(找不到走 的機率也是有的)
3.代碼實現(xiàn)
#include <stdio.h> int pos[8][8] = { 0 }; int travel(int, int); int travel(int x, int y) { int i, j, k, l, m; int tmpX, tmpY; int count, min, tmp; //騎士可走的八個方向(順時針) int ktmoveX[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }; int ktmoveY[8] = { -2, -1, 1, 2, 2, 1, -1, -2 }; //測試下一步坐標 int nextX[8] = { 0 }; int nextY[8] = { 0 }; //記錄每個方向的出路的個數(shù) int exists[8] = { 0 }; //起始用1標記位置 i = x; j = y; pos[i][j] = 1; //遍歷棋盤 for (m = 2; m <= 64; m++) { //初始化八個方向出口個數(shù) for (l = 0; l < 8; l++) { exists[l] = 0; } l = 0; //計算可走方向 //試探八個方向 for (k = 0; k < 8; k++) { tmpX = i + ktmoveX[k]; tmpY = j + ktmoveY[k]; //邊界 跳過 if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) { continue; } //可走 記錄 if (pos[tmpX][tmpY] == 0) { nextX[l] = tmpX; nextY[l] = tmpY; l++; //可走方向加1 } } count = l; //無路可走 返回 if (count == 0) { return 0; //一個方向可走 標記 } else if (count == 1) { min = 0; //找出下個位置出路個數(shù) } else { for (l = 0; l < count; l++) { for (k = 0; k < 8; k++) { tmpX = nextX[l] + ktmoveX[k]; tmpY = nextY[l] + ktmoveY[k]; if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) { continue; } if (pos[tmpX][tmpY] == 0) { exists[l]++; } } } //找出下個位置出路最少的方向 min = 0; tmp = exists[0]; for (l = 0; l < count; l++) { if (exists[l] < tmp) { tmp = exists[l]; min = l; } } } //用序號標記走過的位置 i = nextX[min]; j = nextY[min]; pos[i][j] = m; } return 1; } int main() { int i, j, startX, startY; while (1) { printf("輸入起始點:"); scanf("%d%d", &startX, &startY); if (travel(startX, startY)) { printf("游歷完成!\n"); } else { printf("游歷失??!\n"); } for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { printf("%2d ", pos[i][j]); } printf("\n"); } printf("\n"); } return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
c語言實現(xiàn)輸入一組數(shù)自動從大到小排列的實例代碼
下面小編就為大家?guī)硪黄猚語言實現(xiàn)輸入一組數(shù)自動從大到小排列的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09簡要說明C語言中指針函數(shù)與函數(shù)指針的區(qū)別
這篇文章主要介紹了C語言中指針函數(shù)與函數(shù)指針的區(qū)別,指針函數(shù)和函數(shù)指針是C語言入門學習中的基礎知識,需要的朋友可以參考下2016-04-04