8皇后问题算法

///////////////////////
//八皇后问题 回朔法 
//该算法的思路是:每个皇后先后从第一列出发,找合适自己的列的位置。当找到合适的位置
//   则下一个皇后出发。如果没找到则回朔到上一个皇后继续找,知道8个皇后全有合适位置为止。
#include <stdio.h>

#define MAX 8

int Match(int line[],int p)   //检测是否符合条件
{
 int i;
 if(p==0)
  return 1;
 else
 {
  for(i=0;i<p;i++)
  {
   if(line[i]==line[p])   
    return 0;
   if(p-i==line[p]-line[i])
    return 0;
   if(i+line[i]==p+line[p])
    return 0;
  }
  return 1;
 }
}


void main()
{
 int line[MAX]={0};   //记录皇后的列座标
 int p=0,k=0;           //p指向当前皇后即行座标  k记录解的个数
    int i;
   while(1)
 {
    if(Match(line,p))  //符合条件
    {
     if(p==MAX-1)    //检测是否8个皇后摆好了
     {
      k++;
               for(i=0;i<=p;i++)
       printf("  %d  ",line[i]);
      printf("/n");
      p--;
      if(line[p]==MAX-1)  
       p--;
               line[p]++;
     }
     else  //不到8个皇后直接下一个皇后
     {
     p++;
     line[p]=0;
     }
    }
    else         
    {
     if(line[p]==MAX-1)      //检测是否列座标到终点
     {
      if(p==0)            //判断第1个皇后是否到了终点
         break;
      else
      {
       p--;
       if(line[p]==MAX-1)    //判断第一个皇后是否到了终点
       {
        if(p==0)
         break;
        p--;
       }
       line[p]++;
      }
     }
     else                   //直接下一列
              line[p]++;
    }
 }
 printf("%d",k);
}
////////////注意考虑好各种极限位置
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章