原创 八皇后及n皇后问题

2011-9-6 13:46 5005 3 3 分类: 软件与OS

八皇后问题

是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。

历史

八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和解的个数

下表给出了 n 皇后问题的解的个数包括独立解U(中的数列)以及互不相同的解D(中的数列)的个数:

n

1

2

3

4

5

6

7

8

9

10

11

12

13

14

..

24

25

26

U:

1

0

0

1

2

1

6

12

46

92

341

1,787

9,233

45,752

..

28,439,272,956,934

275,986,683,743,434

2,789,712,466,510,289

D:

1

0

0

2

10

4

40

92

352

724

2,680

14,200

73,712

365,596

..

227,514,171,973,736

2,207,893,435,808,352

22,317,699,616,364,044

 

可以注意到六皇后问题的解的个数比五皇后问题的解的个数要少。现在还没有已知公式可以对 n 计算 n 皇后问题的解的个数。

程序

  1. /*  
  2. * Copyright (c) leo  
  3. * All rights reserved.  
  4. * filename: nQueens 
  5. * summary :  
  6. * version : 1.0  
  7. * author  : leo  
  8. * date    : 8.12.2011  
  9. *问题: 
  10. *   在n*n (n=1 or n>=4 )的棋盘上放置n个皇后,如果在同一行,同一列,同一对角线上都不存在两个皇后, 
  11. *   那么这个棋盘格局就是n皇后的一个解。 
  12. *要求: 
  13. *   找出n皇后的一组解即可,打印出放置满足n皇后条件的棋子位置 
  14. */  
  15. #include<stdio.h>  
  16. #include<math.h>  
  17. #include<stdlib.h>  
  18. #include<conio.h>  
  19. #define N 8  //皇后数=棋盘行列数  
  20. int a[N];     //a为第i行皇后所在列  
  21. void show()   //图形化输出  
  22. {  
  23.     int i;  
  24.     int p,q ;  
  25.     int b[N][N]={0};  
  26.     static t=1;  
  27.     printf("第%d个解为: ",t++);  
  28.     for(i=0;i<N;i++)  
  29.     {  
  30.         b[a]=1;  
  31.         printf("(%d,%d) ",i,a);  
  32.     }  
  33.     printf("\n");  
  34.     for(p=0;p<N;p++)  
  35.     {  
  36.         for(q=0;q<N;q++)  
  37.         {  
  38.             if(b

    [q]==1)  

  39.                 printf("●");  
  40.             else  
  41.                 printf("○");  
  42.         }  
  43.         printf("\n");  
  44.     }  
  45. }  
  46. int check(int n) //满足条件返回1,否则返回0  
  47. {  
  48.     int i;  
  49.     for(i=0;i<n;i++)  
  50.     {  
  51.         if(a==a[n]||fabs(n-i)==fabs(a-a[n])) //at the same column or diagonal (对角线)  
  52.             return 0;  
  53.     }  
  54.     return 1;  
  55. }  
  56. void put(int n) //在第n行放置第n个皇后  
  57. {  
  58.     int i;  
  59.     if(n==N)  
  60.         return ;  
  61.     for(i=0;i<N;i++)  
  62.     {  
  63.         a[n]=i;  
  64.         if(check(n))   //位置合法  
  65.         {  
  66.             if(n==N-1) //皇后全部放置完毕  
  67.                 show();  
  68.             else  
  69.                 put(n+1);  
  70.         }  
  71.     }  
  72. }  
  73. int main ()  
  74. {  
  75.     put(0);  
  76.     return 0;  
  77. }  


 

參考資料

Watkins, John J. (2004). Across the Board: The Mathematics of Chess Problems. Princeton: Princeton University Press. ISBN 0-691-11503-6.

O.-J. DahlE. W. DijkstraC. A. R. Hoare Structured Programming, Academic Press, London, 1972 ISBN 0-12-200550-3 see pp 72-82 for Dijkstra's solution of the 8 Queens problem.

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条