亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言基于回溯算法解決八皇后問題的方法

 更新時間:2018年06月20日 10:46:25   作者:憶之逸之  
這篇文章主要介紹了C語言基于回溯算法解決八皇后問題的方法,簡單描述了八皇后問題,并結合實例形式分析了C語言使用回溯算法解決八皇后問題的相關操作技巧,需要的朋友可以參考下

本文實例講述了C語言基于回溯算法解決八皇后問題的方法。分享給大家供大家參考,具體如下:

問題描述:

八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例:在8X8格的國際象棋棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。

問題求解:

采用回溯算法,即從第一行開始,依次探查可以放置皇后的位置,若找到,則放置皇后,開始探查下一行;若該行沒有位置可以放置皇后,則回溯至上一行,清除該行放置皇后的信息,從該行原本放置皇后的下一個位置開始探查可以放置皇后的位置。求所有解時,每找到一組解,就清除這一組解最后一個皇后的位置信息,開始探查該行另外一個可以放置皇后的位置,依次回溯求解。

存儲結構:

一維數組:col[8]:存放第i列有無皇后的標記信息
一維數組:left[15]:存放每一條左斜線上的有無皇后的標記信息
一維數組:right[15]:存放每一條右直線上有無皇后的標記信息
一維數組:Q[8]:存放第i行的皇后的列下標

代碼實現:

#include<stdio.h>
#define N 8
int col[N] = { 0 };
int right[2 * N - 1] = { 0 };
int left[2 * N - 1] = { 0 };
int Q[N];
int cnt = 0;
void Print()
{
  int i;
  for (i = 0; i < N; i++)
  {
    for (int j = 0; j < N; j++)
    {
      if (Q[i] == j)
        printf("■");
      else
        printf("□");
    }
    printf("\n");
  }
  printf("==========================\n");
  cnt++;
}
void Queen(int i)
{
  int j;
  for (j = 0; j < N; j++)
  {
    if ((!col[j]) && (!left[i + j]) && (!right[7 + i - j]))
    {
      Q[i] = j;//放皇后
      col[j] = 1;
      left[i + j] = 1;
      right[N - 1 + i - j] = 1;//已有皇后的標記
      if (i < N - 1)
      {
        Queen(i + 1);
      }
      else
      {
        Print();
      }
      col[j] = 0;
      right[N - 1 + i - j] = 0;
      left[i + j] = 0;//清除標記,查找下一組解
    }
  }
}
int main(void)
{
  Queen(0);
  printf("%d", cnt);
  getchar();
  return 0;
}

運行結果:

一共92組解,前面結果略去。。

希望本文所述對大家C語言程序設計有所幫助。

相關文章

  • 使用C語言判斷當前存儲大小端問題

    使用C語言判斷當前存儲大小端問題

    這篇文章主要介紹了如何使用C語言判斷當前存儲大小端問題,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 利用Matlab復刻掃雷小游戲

    利用Matlab復刻掃雷小游戲

    windows自帶的游戲《掃雷》是陪伴了無數人的經典游戲,本程序參考《掃雷》的規(guī)則進行了簡化,用Matlab實現,感興趣的小伙伴可以學習一下
    2022-03-03
  • C語言實現輸入一個字符串后打印出該字符串中字符的所有排列

    C語言實現輸入一個字符串后打印出該字符串中字符的所有排列

    這篇文章主要介紹了C語言實現輸入一個字符串后打印出該字符串中字符的所有排列的方法,是數學中非常實用的排列算法,需要的朋友可以參考下
    2014-09-09
  • Linux下C語言修改進程名稱的方法

    Linux下C語言修改進程名稱的方法

    這篇文章主要介紹了Linux下C語言修改進程名稱的方法,涉及Linux下使用C語言操作進程的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言實現自行車存放管理系統(tǒng)

    C語言實現自行車存放管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 用C語言實現單鏈表的各種操作(二)

    用C語言實現單鏈表的各種操作(二)

    本篇文章是對用C語言實現單鏈表的各種操作進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 深度解析三個常見的C語言內存函數

    深度解析三個常見的C語言內存函數

    這篇文章主要深度解析了三個常見的C語言內存函數memcpy,memmove,memcmp,所以本文將對memcpy,memmove,memcmp 三個函數進行詳解和模擬實現,需要的朋友可以參考下
    2023-07-07
  • C++編程之?std::forward使用例子

    C++編程之?std::forward使用例子

    std::forward?是一個?C++11?中的模板函數,其主要作用是在模板函數或模板類中,將一個參數以“原樣”(forward)的方式轉發(fā)給另一個函數,這篇文章主要介紹了C++編程之?std::forward,需要的朋友可以參考下
    2023-03-03
  • C++實現將簡單密碼譯回原文的方法

    C++實現將簡單密碼譯回原文的方法

    這篇文章主要介紹了C++實現將簡單密碼譯回原文的方法,可實現將簡單的字母位移類型的密碼譯回原文的功能,涉及C++簡單字符串操作相關技巧,需要的朋友可以參考下
    2016-05-05
  • 使用C++獲取邏輯執(zhí)行毫秒數的方法

    使用C++獲取邏輯執(zhí)行毫秒數的方法

    這篇文章主要為大家詳細介紹了如何使用C++獲取邏輯執(zhí)行毫秒數的方法,文中借助c++11提供的steady_clock,實現了精確獲取邏輯執(zhí)行時間的方法,需要的可以參考下
    2024-02-02

最新評論