八皇后面试题

八皇后详解,有人可能看不懂上一篇帖子,我又特别整理了一下,尽量弄得简单易懂。注释很详细,基本上都有注释。

先贴一张图,看图看程序比较容易

八皇后面试题_第1张图片

贴上详细代码

[cpp] view plain copy print ?
  1. #include<stdio.h>   
  2. #define ROW 8//代表列,坐标是x   
  3. #define COL 8//代表行,坐标是y   
  4. #define NUM 7//八皇后问题,数组下标0-7   
  5.   
  6. #define TRUE 0//真   
  7. #define FALSE 1//假   
  8.   
  9. #define YES 1//有皇后   
  10. #define NO 0//没有皇后   
  11.   
  12. #define NO_BACK 0//表示不需要回溯   
  13. #define BACK 1//表示需要回溯   
  14.   
  15.   
  16. int a[ROW][COL];//默认值都是0,表示坐标没有皇后,如果改为1,表示这个坐标有皇后   
  17. int k=0;//表示第k中情况   
  18.   
  19. //n代表遍历的列的下标,即X值。ROW   
  20. int queens(int n)  
  21. {  
  22.     int i, j;  
  23.     //输出八皇后棋盘   
  24.     if(n>NUM)  
  25.     {  
  26.         printf("----------%06d----------\n",++k);  
  27.         for(i=0;i<ROW;i++)  
  28.         {  
  29.             for(j=0;j<COL;j++)  
  30.                 printf("%s",a[i][j]==1?"○":"●");//为0说明不是皇后,为1说明是皇后   
  31.             printf("\n");  
  32.         }  
  33.         printf("--------------------------\n\n");  
  34.         return BACK;//表示正常返回,进行回溯   
  35.     }  
  36.     //如果没有遍历完全,   
  37.     for(j=0;j<COL;j++)//遍历Y值0->COL   
  38.     {  
  39.         int flag=TRUE;  
  40.         //这个循环遍历的是X值,就是Y值不变,X值变化   
  41.         for(i=0;i<n;i++)//根据传过来的列的下标X值,ROW值,进行遍历   
  42.         {  
  43.             //如果【同行】【左斜角,东北西南方向】【右斜角,西北东南方向】出现了皇后的话,则推出此次循环,进行下次循环   
  44.             if(a[i][j]==YES||((i+j-n)>=0&&a[i][i+j-n]==YES)||((j+n-i<COL)&&a[i][j+n-i]==YES))  
  45.             {  
  46.                 flag=FALSE;  
  47.                 break;  
  48.             }  
  49.         }  
  50.         if(flag==TRUE)//如果刚才的循环没有出现这种情况   
  51.         {//那么此处放置皇后   
  52.             a[n][j]=YES;  
  53.             if(queens(n+1)==BACK)  
  54.             {//如果下层遍历需要进行回溯   
  55.                 a[n][j]=NO;//此处不放置皇后   
  56.             }else{//如果下层遍历不需要回溯的话,返回   
  57.                 return NO_BACK;  
  58.             }  
  59.         }  
  60.     }  
  61.     //遍历Y值的时候,一直没有出现合适的,出现了flag=FALSE;那么说明下级不能放置皇后,那么进行回溯   
  62.     return BACK;  
  63.       
  64. }  
  65. int main(void)  
  66. {  
  67.     queens(0);  
  68.     return 0;  
  69. }  

    转载:http://blog.csdn.net/wang6279026/article/details/8632957

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