八皇後問題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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...