DFS N皇后

N皇后

一、问题描述: 
    在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。 

输入: 
    给定棋盘的大小n (n ≤ 13) 
输出: 
    输出有多少种放置方法。 

二、解题思路: 
    要解决N皇后问题,其实就是要解决好怎么放置这n个皇后,每一个皇后与前面的所有皇后不能在同一行、同一列、同一对角线,在这里我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。此即是回溯法的精髓所在。当第n个皇后放置成功后,即得到一个可行解,此时再回到上一个皇后重新放置寻找下一个可行解...如此后,即可找出一个n皇后问题的所有可行解。 

  1. #include  
  2. #define N 15  
  3.   
  4. int n; //皇后个数  
  5. int sum = 0; //可行解个数  
  6. int x[N]; //皇后放置的列数  
  7.   
  8. /* 
  9.  *判断函数,判断第k个皇后是否可以放在某一个位置 
  10.  *如果与之前的皇后出现在同一列或同一对角线则放置失败,返回0,否则返回1 
  11. */  
  12. int place(int k)  
  13. {  
  14.     int i;  
  15.     for(i=1;i
  16.       if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i])  
  17.         return 0;  
  18.     return 1;  
  19. }  
  20.   
  21. /* 
  22.  *求解可行解函数,当第t个皇后可以放置在t行的某一位置时,继续放置下一皇后,直到 
  23.  *所有皇后放置结束,如果某一皇后不能放置,则移向下一列放置,如果这一列都不能放 
  24.  *置或所有皇后放置结束,返回上一皇后重新放置,最终返回所有可行解个数。 
  25. */  
  26. int queen(int t)  
  27. {  
  28.     if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0  
  29.       sum++;  
  30.     else  
  31.       for(int i=1;i<=n;i++)  
  32.       {  
  33.           x[t] = i; //标明第t个皇后放在第i列  
  34.           if(place(t)) //如果可以放在某一位置,则继续放下一皇后  
  35.             queen(t+1);   
  36.       }  
  37.     return sum;  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.     int t;  
  43.     scanf("%d",&n);  
  44.     t = queen(1);  
  45.     if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略  
  46.       t = 0;  
  47.     printf("%d",t);  
  48.     return 0;  
  49. }  

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