程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 八皇後問題1,皇後

八皇後問題1,皇後

編輯:關於C語言

八皇後問題1,皇後


問題背景:八皇後問題是一個以國際象棋為背景的問題:如何能夠在 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表示為了一條線。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved