八皇後問題1

来源:http://www.cnblogs.com/robin-xu/archive/2016/02/10/5186144.html
-Advertisement-
Play Games

問題背景:八皇後問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇後,使得任何一個皇後都無法直接吃掉其他的皇後。為了達到這個目的, 任兩個皇後都不能處於同一條橫行、縱行或斜線上。 以下的代碼給出的解法應該是最容易理解的一種方法,本問題還可以用回溯法和遞歸解決,理論上效率


問題背景:八皇後問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇後,使得任何一個皇後都無法直接吃掉其他的皇後。為了達到這個目的,             任兩個皇後都不能處於同一條橫行、縱行或斜線上。

以下的代碼給出的解法應該是最容易理解的一種方法,本問題還可以用回溯法和遞歸解決,理論上效率會比該方法好很多。
  1 #include<stdio.h>
  2 
  3 int chess[8][8];
  4 int count = 0;
  5 
  6 void display(){
  7     int row,col;
  8     for(row = 0; row < 8; row++){
  9         for(col = 0; col < 8; col++){
 10             if(chess[row][col] == 1){
 11                 printf("%c ",45);
 12             }
 13             else if(chess[row][col] == 2){
 14                 putchar(1);
 15                 printf("%c",32);
 16 
 17             }
 18 
 19         }
 20         printf("\n");
 21     }
 22     getch();
 23 }
 24 void setLimitsArea(int row,int col){
 25     int i,j;
 26     for(j = 0; j < 8; j++)
 27         if(col != j)
 28             chess[row][j] = 1;
 29     for(i = 0; i < 8; i++)
 30         if(row != i)
 31             chess[i][col] = 1;
 32     for(i = 1; row - i >= 0 && col - i >= 0; i++)
 33         chess[row - i][col - i] = 1;
 34     for(i = row + 1,j = col + 1; i < 8 && j < 8; i++,j++)
 35         chess[i][j] = 1;
 36     for(i = 1; row - i >= 0 && col + i < 8; i++)
 37         chess[row - i][col + i] = 1;
 38     for(i = row + 1,j = col - 1; i < 8 && j >=0; i++,j--)
 39         chess[i][j] = 1;
 40 }
 41 void eightQueensProblem(){
 42     int row1,row2,row3,row4,row5,row6,row7,row8;
 43     int i, j;
 44     for(row1 = 0;row1 < 8;row1++){
 45         for(row2 = 0;row2 < 8;row2++){
 46             for(row3 = 0;row3 < 8;row3++){
 47                 for(row4 = 0;row4 < 8;row4++){
 48                     for(row5 = 0;row5 < 8;row5++){
 49                         for(row6 = 0;row6 < 8;row6++){
 50                             for(row7 = 0;row7 < 8;row7++){
 51                                 for(row8 = 0;row8 < 8;row8++){
 52                                     for(i = 0;i < 8;i++)
 53                                         for(j = 0;j < 8;j++)
 54                                             chess[i][j] = 0;
 55                                     chess[0][row1] = 2;
 56                                     setLimitsArea(0,row1);
 57                                     if(chess[1][row2] == 0){
 58                                         chess[1][row2] = 2;
 59                                         setLimitsArea(1,row2);
 60                                         if(chess[2][row3] == 0){
 61                                             chess[2][row3] = 2;
 62                                             setLimitsArea(2,row3);
 63                                             if(chess[3][row4] == 0){
 64                                                 chess[3][row4] = 2;
 65                                                 setLimitsArea(3,row4);
 66                                                 if(chess[4][row5] == 0){
 67                                                     chess[4][row5] = 2;
 68                                                     setLimitsArea(4,row5);
 69                                                     if(chess[5][row6] == 0){
 70                                                         chess[5][row6] = 2;
 71                                                         setLimitsArea(5,row6);
 72                                                         if(chess[6][row7] == 0){
 73                                                             chess[6][row7] = 2;
 74                                                             setLimitsArea(6,row7);
 75                                                             if(chess[7][row8] == 0){
 76                                                                 chess[7][row8] = 2;
 77                                                                 count = count + 1;
 78                                                                 printf("  NO %d Method   \n",count);
 79                                                                 display();
 80                                                             }
 81                                                         }
 82                                                     }
 83                                                 }
 84                                             }
 85                                         }
 86                                     }
 87                                 }
 88                             }
 89                         }
 90                     }
 91                 }
 92             }
 93         }
 94     }
 95 }
 96 
 97 int main(){
 98     int row = 0,col = 0;
 99     for(row = 0; row < 8; row++)
100         for(col = 0; col < 8; col++)
101             chess[row][col] = 0;
102     eightQueensProblem();
103     return 0;
104 }
代碼思路簡介:setLimitArea的作用是當在chess[row][col]放置了皇後之後(該元素的值設置為2)。將該元素所在的行,所在的列,主對角線,和斜對角線上的元素都設置為1(原來整個數組元             素的值都為0),表示以後的皇後不可以放在這裡。             eightQueensProblem函數對八個皇後的每一種放置方法(每行放置一個,每行從位置0到7嘗試)進行判斷。將符合的輸出。             dispaly僅僅是列印函數,但是將表示放置了皇後的2在顯示的時候顯示為一個笑臉符號,將1表示為了一條線。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分類:C#、Android、VS2015; 創建日期:2016-02-08 在Android應用中,常用的對話框有:Toast、AlertDialog、ProgressDialog、時間選擇對話框、日期選擇對話框等。這一章主要介紹這些常用對話框的基本用法。 本章源程式共有4個示例,這些示例都在同一個
  • 前一段時間們需要對一個List<Model>集合去重,情況是該集合中會出現多個Name屬性值相同的,但是其他屬性值不同的數據。 在這種情況下,需求要只保留其中一個就好。 我覺得遍歷和HashSet都不是我想要的,便採用了一下方式 定義Compare類,繼承IEqualityComparer介面 pu
  • 看了《CLR via C#》的17章委托後,為自己做一點淺顯的總結,也分享給需要的人。 .NET通過委托來提供一種回調函數機制,.NET委托提供了很多功能,例如確保回調方法是類型安全的(CLR重要目標)。委托好允許順序調用多個方法(委托鏈),並且支持調用靜態方法和實例方法。 委托的基本語法就不多說了
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 圖庫(也叫畫廊)是一個佈局小部件,用於在可水平滾動的列表中顯示每一副圖片,當前所選的圖片將置於視圖的中心。 註意:Android已經棄用了這個小部件,棄用的原因是用Galery實現的效率比較低,官方的建議是改為用H
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 1、CheckBox 覆選 【Checked】屬性:是否選中。 2、RadioButton 單選 【Checked】屬性:是否選中。 【RadioGroup】屬性:RadioButton的分組容器。註意必須將Rad
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 1、Button 常規按鈕。 2、TextView 文本視圖,其功能和WPF的TextBlock控制項類似,【工具箱】中提供的3個組件實際上是同一個TextView控制項用不同的屬性來區分的,這3個不同的屬性在【工具箱
  • 分類:C#、Android、VS2015; 創建日期:2016-02-06 這一章主要介紹Android簡單控制項的基本用法。本章源程式共有9個示例,這些示例都在同一個項目中。 項目名:ch05demos,項目模板:Blank App(Android) 運行主界面截圖如下: 點擊每行的示例項,即進入對
  • 分類:C#、Android、VS2015;創建日期:2016-02-06 開發人員可以用以下兩種方式聲明UI:一是通過.xml文件(不帶預覽界面)或者.axml文件(帶預覽界面)來描述;二是用C#代碼實現。 用.axml文件描述用戶界面(UI)時,設計器分為【設計】視圖和【源】視圖。這種方式的優點是
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...