您的位置:首页 > 编程语言

n皇后问题--c代码

2017-11-05 21:41 225 查看
#include <stdio.h>

#include <stdlib.h>

#define MAXNUM 30

int num;

int x[MAXNUM];

bool Place(int k)

{

  int i;

  i=1;

  while(i<k)

   {

    

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

       return false;

     i=i+1;

   }

  return true;

}

void Print(int x[],int n)

{

   //当前解得个数;

   num++;

  printf("第%d\t种解法:(",num);

  for(int i=1;i<=n;i++)

   {

     //输出当前解;

     printf("%d,",x[i]);

     //每一个解输出完毕换行;

     if(i%n==0)printf(");\n");

   }

}

void NQueens(int n)

{

  int k=1;

  x[1]=0;

  while(k>0)

   {

     // 向右移一列;

     x[k]+=1;

     //向右移至出最右列或可以放置皇后的列;

     while(x[k]<=n&&!Place(k))

       x[k]+=1;

     if(x[k]<=n)

       //向右移未移出棋盘;

     {

       //已移至最后一行;

       if(k==n)

          Print(x,n);

       else

       {

          //向下移一行;

          k=k+1;

          x[k]=0;

       }

     }

     //回溯至上一行;

     else

       k--;

   }

}

void main()

{

  int n;

  char w;

  printf("---^@^*** C Program aims at:n皇后问题***^@^---\n");

  printf("_____By Wangxin 278810732@qq.com \n");

  printf("^^^ Finish-time: 3/11/2011,16:00:00 ^^^\n");

WX:printf("请输入皇后个数N:");

  scanf("%d",&n);     //ctrl+break退出程序

  num=0;

  NQueens(n);

  printf("%d 皇后有%d种解法!\t",n,num);

   //清楚输入数据缓存;

  fflush(stdin);

  printf("是否继续 (Y/N)? :\t");

   //获取输入字符;

  w=getchar();

  printf("\n");

   //分之选择结构;

  switch(w)

   {

  case 'Y':

  case 'y':goto WX;break;

  case 'N':

  case 'n':break;

  default: break;

   }

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