八皇后问题解析.关键问题提示

 八皇后问题最关键的一步就是确定check方法!可以通过利用对角线法则(x1-x2)=(y1-y2)判断!而不是漫无目的的瞎找!!这个很关键

 

 

  
  
  
  
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.   
  4. #define max 8 
  5.   
  6.   
  7. int queen[max], sum=0; /* max为棋盘最大坐标 */ 
  8.   
  9. void show() /* 输出所有皇后的坐标 */ 
  10.     int i; 
  11.     for(i = 0; i < max; i++) 
  12.     { 
  13.          printf("(%d,%d) ", i, queen[i]); 
  14.     } 
  15.     printf("\n"); 
  16.     sum++; 
  17.   
  18. int check(int n) /* 检查当前列能否放置皇后 */ 
  19.     int i; 
  20.     for(i = 0; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */ 
  21.     { 
  22.         if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)) 
  23.         { 
  24.             return 1; 
  25.         } 
  26.     } 
  27.     return 0; 
  28.   
  29. void put(int n) /* 回溯尝试皇后位置,n为横坐标 */ 
  30.     int i; 
  31.     for(i = 0; i < max; i++) 
  32.     {        
  33.         queen[n] = i; /* 将皇后摆到当前循环到的位置 */ 
  34.         if(!check(n)) 
  35.         {            
  36.             if(n == max - 1) 
  37.             { 
  38.                 show(); /* 如果全部摆好,则输出所有皇后的坐标 */ 
  39.             }          
  40.             else 
  41.             { 
  42.                 put(n + 1); /* 否则继续摆放下一个皇后 */ 
  43.             } 
  44.         } 
  45.     } 
  46.   
  47. int main() 
  48.     put(0); /* 从横坐标为0开始依次尝试 */ 
  49.     printf("%d", sum); 
  50.     system("pause"); 
  51.     return 0; 

你可能感兴趣的:(八皇后)