欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)騎士走棋盤(pán)算法

 更新時(shí)間:2021年07月23日 10:10:56   作者:老樊Lu碼  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)騎士走棋盤(pán)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++實(shí)現(xiàn)騎士走棋盤(pán)算法的具體代碼,供大家參考,具體內(nèi)容如下

1.問(wèn)題描述

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

2.基本思路

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

3.代碼實(shí)現(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;
 
 //騎士可走的八個(gè)方向(順時(shí)針)
 int ktmoveX[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
 int ktmoveY[8] = { -2, -1, 1, 2, 2, 1, -1, -2 };
 
 //測(cè)試下一步坐標(biāo)
 int nextX[8] = { 0 };
 int nextY[8] = { 0 };
 
 //記錄每個(gè)方向的出路的個(gè)數(shù)
 int exists[8] = { 0 };
 
 //起始用1標(biāo)記位置
 i = x;
 j = y;
 pos[i][j] = 1;
 
 //遍歷棋盤(pán)
 for (m = 2; m <= 64; m++) {
  //初始化八個(gè)方向出口個(gè)數(shù)
  for (l = 0; l < 8; l++) {
   exists[l] = 0;
  }
  l = 0; //計(jì)算可走方向
 
      //試探八個(gè)方向
  for (k = 0; k < 8; k++) {
   tmpX = i + ktmoveX[k];
   tmpY = j + ktmoveY[k];
   //邊界 跳過(guò)
   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;
  //無(wú)路可走 返回
  if (count == 0) {
   return 0;
   //一個(gè)方向可走 標(biāo)記
  }
  else if (count == 1) {
   min = 0;
   //找出下個(gè)位置出路個(gè)數(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]++;
     }
    }
   }
   //找出下個(gè)位置出路最少的方向
   min = 0;
   tmp = exists[0];
   for (l = 0; l < count; l++) {
    if (exists[l] < tmp) {
     tmp = exists[l];
     min = l;
    }
   }
  }
  //用序號(hào)標(biāo)記走過(guò)的位置
  i = nextX[min];
  j = nextY[min];
  pos[i][j] = m;
 }
 return 1;
}
 
int main()
{
 int i, j, startX, startY;
 while (1)
 {
  printf("輸入起始點(diǎn):");
  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;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Clion刷LeetCode的方法

    使用Clion刷LeetCode的方法

    這篇文章主要介紹了使用Clion刷LeetCode的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • [c++]變量聲明與定義的規(guī)則詳解

    [c++]變量聲明與定義的規(guī)則詳解

    這篇文章主要介紹了[c++]變量聲明與定義的規(guī)則詳解,對(duì)于學(xué)習(xí)c++的朋友來(lái)說(shuō)這是一個(gè)很細(xì)膩的文章,代碼完整,需要的朋友可以參考下
    2021-04-04
  • c語(yǔ)言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼

    c語(yǔ)言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇c語(yǔ)言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C/C++實(shí)現(xiàn)快速排序算法的兩種方式實(shí)例

    C/C++實(shí)現(xiàn)快速排序算法的兩種方式實(shí)例

    快速排序是一種采用分治思想,在實(shí)踐中通常運(yùn)行較快一種排序算法,這篇文章主要給大家介紹了關(guān)于C/C++實(shí)現(xiàn)快速排序的兩種方式的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2021-08-08
  • 一篇文章帶你了解C語(yǔ)言函數(shù)遞歸

    一篇文章帶你了解C語(yǔ)言函數(shù)遞歸

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言函數(shù)遞歸,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C C++ LeetCode題解在二叉樹(shù)中增加一行示例詳解

    C C++ LeetCode題解在二叉樹(shù)中增加一行示例詳解

    這篇文章主要為大家介紹了C C++ LeetCode題解在二叉樹(shù)中增加一行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))

    常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))

    下面小編就為大家?guī)?lái)一篇常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • 簡(jiǎn)要說(shuō)明C語(yǔ)言中指針函數(shù)與函數(shù)指針的區(qū)別

    簡(jiǎn)要說(shuō)明C語(yǔ)言中指針函數(shù)與函數(shù)指針的區(qū)別

    這篇文章主要介紹了C語(yǔ)言中指針函數(shù)與函數(shù)指針的區(qū)別,指針函數(shù)和函數(shù)指針是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-04-04
  • C++STL之string類(lèi)的使用

    C++STL之string類(lèi)的使用

    這篇文章主要為大家詳細(xì)介紹了C++STL中的string類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • VSCode插件開(kāi)發(fā)全攻略之命令、菜單、快捷鍵

    VSCode插件開(kāi)發(fā)全攻略之命令、菜單、快捷鍵

    這篇文章主要介紹了VSCode插件開(kāi)發(fā)全攻略之命令、菜單、快捷鍵,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論