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

八皇后问题求解----C++实现

2010-08-04 21:16 483 查看
#include <iostream>

#define NUM 8

using namespace std;

typedef struct Empress
{
int x;
int y;
int flag;
bool IfEmp;
}EMP;

void InitChessboard(EMP Chessboard[9][9]);
void InitEmpress(EMP Empress[]);
void ReconsChessboard(EMP Chessboard[9][9],EMP Empress[],int n);
void SetFlag(EMP Chessboard[9][9],EMP Empress[],int n);
bool FlagSearch(EMP Chessboard[9][9],EMP Empress[],int n,int x,int y);
void OutPutResult(FILE *fp,EMP Chessboard[9][9],EMP Empress[],int count);

int main()
{
FILE *fp=NULL;
EMP Chessboard[9][9];
EMP Empress[9];
InitChessboard(Chessboard);
InitEmpress(Empress);
int n=1;
int count=1;
int x=1,y=1;
if((fp=fopen("EightEmpress.txt","w"))==NULL)
{
printf("打开EightEmpress.txt失败!/n");
exit(1);
}
fprintf(fp,"八皇后问题输出结果:/n");
fprintf(fp,"●表示皇后位置 ○表示无子/n/n");
cout <<"开始运算八皇后问题求解.../n";
while(count<=92)
{
if(FlagSearch(Chessboard,Empress,n,x,y))
{
SetFlag(Chessboard,Empress,n);
if(n==8)
{
OutPutResult(fp,Chessboard,Empress,count);
cout <<"已求出解 "<<count<<" 个解/n";
count++;
ReconsChessboard(Chessboard,Empress,n);
x=Empress
.x;
y=Empress
.y;
}
else
{
x=Empress
.x;
y=Empress
.y;
n++;
}
}
else
{
n--;
ReconsChessboard(Chessboard,Empress,n);
x=Empress
.x;
y=Empress
.y;
}
}
cout <<"/n求解完成一共求出 "<<count-1<<" 个解/n";
cout <<"求解结果已保存到 EightEmpress.txt 文件中/n";
fclose(fp);
system("start EightEmpress.txt");
system("pause");
return 0;
}

void InitChessboard(EMP Chessboard[9][9])
{
for(int i=0;i<=8;i++)
{
Chessboard[0][i].x=0;
Chessboard[0][i].y=i;
Chessboard[0][i].IfEmp=false;
Chessboard[0][i].flag=1;
Chessboard[i][0].x=i;
Chessboard[i][0].y=0;
Chessboard[i][0].IfEmp=false;
Chessboard[i][0].flag=1;
}
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
{
Chessboard[i][j].x=i;
Chessboard[i][j].y=j;
Chessboard[i][j].IfEmp=false;
Chessboard[i][j].flag=0;
}
}

void InitEmpress(EMP Empress[])
{
for(int i=0;i<=8;i++)
{
Empress[i].x=0;
Empress[i].y=0;
Empress[i].IfEmp=false;
Empress[i].flag=0;
}
}

void ReconsChessboard(EMP Chessboard[9][9],EMP Empress[],int n)
{
InitChessboard(Chessboard);
for(int i=1;i<n;i++)
{
SetFlag(Chessboard,Empress,i);
Chessboard[Empress[i].x][Empress[i].y].IfEmp=true;
}
Chessboard[Empress
.x][Empress
.y].flag=1;
}

void SetFlag(EMP Chessboard[9][9],EMP Empress[],int n)
{
int i,j;
i=Empress
.x;
j=Empress
.y;
for(int k=1;k<=8;k++)
{
Chessboard[i][k].flag=1;
Chessboard[k][j].flag=1;
}

while(i!=1&&j!=1)
{
i--;
j--;
Chessboard[i][j].flag=1;
}
i=Empress
.x;
j=Empress
.y;
while(i!=8&&j!=8)
{
i++;
j++;
Chessboard[i][j].flag=1;
}

i=Empress
.x;
j=Empress
.y;
while(i!=8&&j!=1)
{
i++;
j--;
Chessboard[i][j].flag=1;
}
i=Empress
.x;
j=Empress
.y;
while(i!=1&&j!=8)
{
i--;
j++;
Chessboard[i][j].flag=1;
}
}

bool FlagSearch(EMP Chessboard[9][9],EMP Empress[],int n,int x,int y)
{
EMP *p;
for(p=&Chessboard[x][y];p<=&Chessboard[8][8];p++)
{
if(p->flag==0)
{
p->IfEmp=true;
Empress
.IfEmp=true;
Empress
.flag=1;
Empress
.x=p->x;
Empress
.y=p->y;
return true;
}
}
return false;
}

void OutPutResult(FILE *fp,EMP Chessboard[9][9],EMP Empress[],int count)
{
fprintf(fp,"第 %d 种情况:/n/n",count);
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
if(Chessboard[i][j].IfEmp)
{
fprintf(fp,"●");
}
else
{
fprintf(fp,"○");
}
}
fprintf(fp,"/n");
}
fprintf(fp,"/n/n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: