八皇后问题

作者在 2008-10-03 00:11:23 发布以下内容
这个经典的问题描述如下:
在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
先输出一种情况:
//********************************************************************
//* 题目:             八皇后问题                                    *
//* 数据结构:         栈                                            *
//* 作者:             blueboy                                       *
//********************************************************************
#include<stdio.h>                      
int s[8];                                          //定义栈
int top=0;
int TempRow=0;                  
int Push( int s[],int e)                           //压栈
{
 s[top]=e;
 top++;
 return 0;
}
int Pop(int s[],int *e)                            //弹栈
{
 top--;
 *e=s[top];
 return 0;
}
int main()
{
 int i,j;
 int chess[8][8];
 int a[8],b[15],c[15];
 for(i=0;i<8;i++)
  for(j=0;j<8;j++)
   chess[i][j]=0;
 for(i=0;i<8;i++)                              //安全位置初始化
   a[i]=1;
 for(i=0;i<15;i++)
 {
  b[i]=c[i]=1;
 }
 while(top<8)
 {
  i=top;
  for(j=TempRow;j<8;j++)
  {
   if(a[j]&&b[i+j]&&c[i-j+7])           //判断是否安全
   {
    chess[top][j]=1;                 //放置皇后
    Push(s,j);
    a[j]=b[i+j]=c[i-j+7]=0; 
    TempRow=0;
    break;
   }
  }
  if(j>=8)                                //如果溢出,则弹栈
  {
   Pop(s,&TempRow);
   chess[top][TempRow]=0;              //撤销皇后
   a[TempRow]=b[top+TempRow]=c[top-TempRow+7]=1;
   TempRow++;
  }
 }
 printf("压栈情况如下:\n\n");
 printf("\t\t行\t列\n");
 for(i=0;i<8;i++)
 {
  Pop(s,&TempRow);
  printf("\t\t%d\t%d\n",8-i,TempRow+1);
 }
 printf("以0-1矩阵表出为(1为皇后所在位置):\n\n");
 for(i=0;i<8;i++){
  printf("\t\t");
 for(j=0;j<8;j++)
  printf("%d ",chess[i][j]);
 printf("\n");
 }
 return 0;
}
/////////以下是递归求所有情况//////////////////////////////////////////////////////////////
//********************************************************************
//* 题目:EightQueen(所有可能)                                       *
//* 思想:递归解法                                                   *
//* 作者:blueboy                                                    *
//********************************************************************
#include<stdio.h>
int chess[8][8]={0};
int a[8],b[15],c[15];
int sum=0;                                            //统计所有摆法
void PutQueen(int n)
{
 int col,i,j;
 for(col=0;col<8;col++)
 {
  if(a[col]&& b[n+col] && c[n-col+7])                 //判断安全位置
  {
   chess[n][col]=1;                            //放置皇后
   a[col]=0;
   b[n+col]=0;
   c[n-col+7]=0;
   if(n==7)
   {
    sum++;
    printf("第%d种可能的摆法:\n",sum);    //输出皇后摆法
     for(i=0;i<8;i++){
      printf("\t\t");
      for(j=0;j<8;j++)
       printf("%d ",chess[i][j]);
      printf("\n");
     }
     printf("\n");
//     goto END;                         //输出第一种摆法
     if(sum%10==0)                     //每输出十种暂停
     {
      printf("按回车键继续……");
      getchar();
     }
   }
   else
    PutQueen(n+1);                        //递归
   chess[n][col]=0;                            //取消皇后
   b[n+col]=1;                                 
   c[n-col+7]=1;
   a[col]=1;                          
  }
 }
//END: return;
}
int main()

 int i;
 for(i=0;i<8;++i)
  a[i]=1;
 for(i=0;i<15;++i)
 {
  b[i]=1;
  c[i]=1;
 }
 PutQueen(0);
 printf("八皇后摆法总数: %d\n",sum);
 return 0;
}
技术分享 | 阅读 2110 次
文章评论,共0条
游客请输入验证码