作者在 2008-10-03 00:11:23 发布以下内容
这个经典的问题描述如下:
在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
在一个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;
}
//* 题目: 八皇后问题 *
//* 数据结构: 栈 *
//* 作者: 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; //输出第一种摆法
//* 题目: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); //递归
{
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;
}
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;
}