八皇后求解(转)

来源:互联网 发布:mac图片处理软件 编辑:程序博客网 时间:2024/04/29 06:28

方案一:

#include<stdio.h>

int s[8]={0}; /*记录竖行是否已放子*/
int left[17]={0}; /*记录左斜行是否已放子*/
int right[17]={0};/*记录右斜行是否已放子*/
int a[8][8]={0};
int k=0;/*记录有多少种解*/
/*-------------------------打印八皇后-------------------------------*/
void Printqueen(int k)
{
int i,j;
FILE *pt; /*写入文件*/
pt=fopen("queen.txt","a");
printf("/n-----NO.%d-----/n",k);
fprintf(pt,"/n-----NO.%d-----/n",k);
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
printf("%2d",a[i][j]);
fprintf(pt,"%2d",a[i][j]);
}
printf("/n");
fprintf(pt,"/n");
}
fclose(pt);
}
/*------------------------求解八皇后---------------------------------*/
void buildqueen(int j)
{
int i;
for(i=0;i<8;i++) {
if(s[i]==0&&left[j-i+7]==0&&right[j+i]==0) { /*所在的竖,斜行还没有放过则可放*/
a[j][i]=1;
left[j-i+7]=1;right[j+i]=1; /*放置并标志*/
s[i]=1;
if(j<7) buildqueen(j+1); /*最后一行不用再调用了*/
if(j==7) { /*最后一行都能成功放,则得到一种解,则打印出来*/
k++;
Printqueen(k);
}
a[j][i]=0; /*取消这个位置,找下一位置*/
left[j-i+7]=0;right[j+i]=0;
s[i]=0;
}
}
}
/*-------------------------main()------------------------------------*/
void main()
{
 buildqueen(0);
 getch();
}
 

方案二

#include "stdio.h"
int count;
int queen [10], column[20],left[20],right[20];
void prt1()
{
   int j;
   printf("No.%d ",++count);
   for (j=1;j<=8;j++)
   printf("%3d",queen[j]);
   printf("/n");
}
void try(int i)
{
   int j;
   for (j=1;j<=8;j++)
   if (column[j] && left[i-j+8] && right[i+j])
   {
      queen[i]=j;
      column[j]=0;
    left[i-j+8]=0;
    right[i+j]=0;
    if (i<8) try(i+1);
    else prt1();
    column[j]=left[i-j+8]=right[i+j]=1;
   }
}
main()
{
  int i;
  for (i=1;i<=16;i++)
  column[i]=left[i]=right[i]=1;
  count=0;
  try(1);
  getch();
}
 

原创粉丝点击