91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現騎士走棋盤算法

發布時間:2022-03-28 15:41:07 來源:億速云 閱讀:159 作者:iii 欄目:大數據

這篇“C++怎么實現騎士走棋盤算法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++怎么實現騎士走棋盤算法”文章吧。

1.問題描述

騎士旅游Knight tour在十八世紀初倍受數學家與拼圖迷的注意,它什么時候被提出已不可考,騎士的走法為西洋 棋的走法,騎士可以由任一個位置出發,它要如何走完所有的位置。

2.基本思路

騎士的走法,基本上可以用遞回來解決,但是純粹的遞回在維度大時相當沒有效率,一個聰明的解法由J.CWarnsdorff 在1823年提出, 簡單地說,先將最難的位置走完,接下來的路就寬廣了,騎士所想要的下一步,為下一不再 選 擇時,所能走的步數最少的一步。使用這個方法,在不使用遞回的情況下,可以有較高的機率找出走法(找不到走 的機率也是有的)

3.代碼實現

#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 };
 
 //記錄每個方向的出路的個數
 int exists[8] = { 0 };
 
 //起始用1標記位置
 i = x;
 j = y;
 pos[i][j] = 1;
 
 //遍歷棋盤
 for (m = 2; m <= 64; m++) {
  //初始化八個方向出口個數
  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;
   //找出下個位置出路個數
  }
  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("游歷完成!
");
  }
  else {
   printf("游歷失敗!
");
  }
  for (i = 0; i < 8; i++) {
   for (j = 0; j < 8; j++) {
    printf("%2d ", pos[i][j]);
   }
   printf("
");
  }
  printf("
");
 }
 
 return 0;
}

C++怎么實現騎士走棋盤算法

以上就是關于“C++怎么實現騎士走棋盤算法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

通海县| 金塔县| 康马县| 泰宁县| 东兴市| 梅州市| 邳州市| 遂平县| 盐山县| 马关县| 大安市| 许昌市| 织金县| 迁安市| 泸溪县| 报价| 玉环县| 久治县| 杨浦区| 云梦县| 奉节县| 拉萨市| 吴江市| 香港| 新竹市| 木里| 叶城县| 昔阳县| 桃园县| 晴隆县| 许昌县| 长岭县| 申扎县| 沂南县| 宁蒗| 上蔡县| 旅游| 娄底市| 河东区| 桑植县| 深水埗区|