新皇后问题3种Word格式.docx
- 文档编号:17828157
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:17.42KB
新皇后问题3种Word格式.docx
《新皇后问题3种Word格式.docx》由会员分享,可在线阅读,更多相关《新皇后问题3种Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
第"
m<
个解"
;
for(i=1;
i<
=n;
i++)
("
"
q[i]<
)"
endl;
i++)//行
{
for(j=1;
j<
j++)//列
{
if(q[i]!
=j)
cout<
x"
else
Q"
}
cout<
}
}
//检验第i行的k列上是否可以摆放皇后
intfind(inti,intk)
intj=1;
while(j<
i)//j=1~i-1是已经放置了皇后的行
{
//第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上
if(q[j]==k||abs(j-i)==abs(q[j]-k))
return0;
j++;
return1;
//放置皇后到棋盘上
voidplace(intk,intn)
intj;
if(k>
n)
print(n);
else
j++)//试探第k行的每一个列
if(find(k,j))
{
q[k]=j;
place(k+1,n);
//递归总是在成功完成了上次的任务的时候才做下一个任务
}
intmain(void)
clock_tstart,finish;
doubletotaltime;
start=clock();
for(inti=0;
10000000;
intn;
请输入皇后的个数(n<
=20),n=:
cin>
>
n;
if(n>
20)
n值太大,不能求解!
n皇后问题求解如下(每列的皇后所在的行数):
place(1,n);
//问题从最初状态解起
break;
finish=clock();
totaltime=(double)(finish-start)/CLOCK_PER_SEC;
程序运行所用时间为:
totaltime<
s"
return0;
用类和递归解决皇后问题:
cmath>
#defineN100
classQueen
public:
Queen(){num=-1;
voidPrint(intn);
//输出皇后的排列,打出的数字为每个皇后的坐标
intCheck(inti,intk);
//判断位置是否符合要求
voidQueens(intk,intn);
//递归调用
intcount();
//计数
private:
intq[N];
intnum;
};
voidmain()
QueenQ;
请输入Queen的数目(n>
0):
0)
Queen可能的位置坐标:
Q.Queens(1,n);
共有"
Q.count()<
种方法放置Queen"
ERROR输入数字错误"
runtimeis:
voidQueen:
:
Queens(intk,intn)//计算出皇后的排列,k是当前皇后数量,n是数量上限
{inti;
n)//如果达到里要求的数量输出皇后排列
{Print(n);
count();
else//否则在适当的位置添加一个新皇后
for(i=1;
if(Check(i,k))//判断该行中该位置放置'
皇后'
是否符合要求
q[k]=i;
//记录改行中该点的位置
Queens(k+1,n);
//放置下一行的'
Print(intn)
inti;
intQueen:
Check(inti,intk)
j=1;
k)
if((q[j]==i)||abs(q[j]-i)==abs(j-k))//判断列,判断斜线
//不符合返回0
//符合返回
count()
num++;
returnnum;
利用栈存储和递归实现的解决皇后问题:
#include<
malloc.h>
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintStatus;
typedefstructSElemType{
inta;
intb;
intc;
}SElemType;
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&
S){
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStak
StatusGetTop(SqStackS,SElemType&
e,int&
i){
if(S.top==S.base)returnERROR;
e=*(S.top-i);
returnOK;
}//GetToop
StatusPush(SqStack&
S,SElemTypee){
if(S.top-S.base>
=S.stacksize){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}//if
*S.top++=e;
}//PUSH
StatusPop(SqStack&
S,SElemType&
e){
if(S.top==S.base)returnERROR;
e=*--S.top;
}//Pop
intfind_check(intk,inti,SqStack&
S,SElemType&
for(j=1;
k;
j++){
GetTop(S,e,j);
if(e.c==i||e.b-k==e.c-i||e.b-k==i-e.c)
//当m行与n行皇后位于同一对角线时,不符合要求,返回0
voidQueen(intk,intn,SqStack&
e,int&
numb){//计算出皇后的排列,i是当前皇后数量,n是数量上限
inti,j,l,x;
if(k>
{//如果达到里要求的数量输出皇后排列
numb++;
for(l=n;
l>
0;
l--)
{
for(x=1;
x<
x++)
{
GetTop(S,e,l);
if(x==e.c)
cout<
else
}cout<
}
for(j=n;
j>
j--)
GetTop(S,e,j);
cout<
e.b<
e.c<
'
\n'
Pop(S,e);
{//否则在适当的位置添加一个新皇后
i<
i++)
if(find_check(k,i,S,e))
{
e.b=k;
e.c=i;
Push(S,e);
Queen(k+1,n,S,e,numb);
if(i==n)
Pop(S,e);
else{
}
intmain()
intn,numb=0;
SqStackS;
SElemTypee;
InitStack(S);
请输入皇后的个数n为:
cin>
e.a=n;
e.b=1;
e.c=1;
Queen(1,n,S,e,numb);
numb<
种方法放置Queen的方式"
break;
计算时间的模板:
clock_tstart,finish;
doubletotaltime;
start=clock();
for(inti=0;
finish=clock();
totaltime=(double)(finish-start)/CLOCK_PER_SEC;
cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 皇后 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)