您的位置:首页 > 其它

八皇后问题——回溯法解决

2012-02-23 12:08 381 查看
在8X8个格子里,放置8个皇后。要求这8个皇后任意两个 不在同一行,不在同一列,不在对角线上。

参考代码如下:

#include<stdio.h>

#include<math.h>

int X[9]={0}; //X[0]是备用的。

int place(int k)

{

 int i;

 for(i=1;i<k;i++)

 {

  if( (X[i]==X[k]) || (abs(X[i]-X[k])==abs(i-k)) )

  {

   return 0;

  }

 }

 return 1;

}

void N8Queens(void)

{

 int k;

 k=1;

 while(k>0)

 {

  X[k]++;

  while((X[k]<=8) && (!place(k)) ) //找到k行一个有效的位置

  {

   X[k]++;

  }

  if(X[k]<=8)

  {

   if(k==8)  //说明8个皇后排好了

   {

    return;

   }

   else

   {

    k++; //准备排下一行!下一行也是需要从第一列开始。

    X[k]=0; 

   }

  }

  else  //说明当前行没有位置可以放,需要回溯到上一行!

  {

   X[k]=0; //因为要返回上一行,所以当前行已经无效了!

   k--;

  }

 }

}

int main()

{

 int i;

 N8Queens();

 for(i=1;i<=8;i++)

 {

  printf("%d\n",X[i]);

 }

 return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: