算法实验 八皇后问题.docx
- 文档编号:4379166
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:12
- 大小:265.75KB
算法实验 八皇后问题.docx
《算法实验 八皇后问题.docx》由会员分享,可在线阅读,更多相关《算法实验 八皇后问题.docx(12页珍藏版)》请在冰豆网上搜索。
算法实验八皇后问题
姓名:
+++学号:
090610213班级:
0904103
实验题目:
八皇后问题
问题分析:
要在8*8的国际象棋棋盘中放8个皇后,是任意两个皇后都不能互相吃掉。
规则:
皇后能吃掉同一行、同一列、同一对角线的任意棋子。
解决问题的关键为怎样取到8个位置,判断他们符合要求。
数学模型:
每一行中只能取到一个位置,这样问题的解空间就是8个皇后所在的列的序号。
1)通过8重循环从每一行中取得一个位置,检验取到的检验8个位置不在同一列、同一对角线。
2)按深度优先的思想,从第一个皇后开始搜索,确定一个位置后,在搜索第二个皇后的位置……;每前进一步检查是否满足约束条件,不满足时,用continue语句回溯到上一个皇后,继续尝试下一位置;满足约束条件时,开始搜索下一位置,知道找到问题解。
约束条件:
不在同一列的表达式xi!
=xj
不在同一对角线上的约束条件abs(xi-xj)!
=abs(i-j)
算法策略的选择:
蛮力枚举法枚举回溯法
程序流程图:
算法的时间复杂度的分析:
1)采用8重循环时间复杂度为8
程序实现:
1)
voidCEightqueDlg:
:
OnButton1()
{//取自不同行的位置count=0;
for(que[0]=0;que[0]<8;que[0]++)
for(que[1]=0;que[1]<8;que[1]++)
for(que[2]=0;que[2]<8;que[2]++)
for(que[3]=0;que[3]<8;que[3]++)
for(que[4]=0;que[4]<8;que[4]++)
for(que[5]=0;que[5]<8;que[5]++)
for(que[6]=0;que[6]<8;que[6]++)
for(que[7]=0;que[7]<8;que[7]++)
Judge();
CStringstr;
str.Format("%d",count);
MessageBox(str);
}
voidCEightqueDlg:
:
Judge()
{for(intt1=0;t1<8;t1++)//验证是否取自不同的列
for(intt2=t1+1;t2<8;t2++){if(que[t1]==que[t2])
return;//存在处于同一列的位置则返}
boolflag=false;//验证是否在不同的对角线上
for(intj=0;j<7;j++)
{for(inti=1;i<8-j;i++)
{if(que[j]+i==que[i+j]||que[j]-i==que[i+j])
{flag=true;break;}
}if(flag)break;}
if(!
flag)
{CStringa;a="";
for(intk=0;k<8;k++)
{a.Format("%d",que[k]);out+=a;}out+="";
if(out.GetLength()%72==0)out+='\n';
GetDlgItem(IDC_STATIC1)->SetWindowText(out);count++;}}
2)voidCEight2Dlg:
:
OnCancel()
{inta[8];intcount=0CStringaa,bb;aa=bb="";
for(a[0]=0;a[0]<8;a[0]++)
for(a[1]=0;a[1]<8;a[1]++)
{if(check(a,1)==0)continue;
for(a[2]=0;a[2]<8;a[2]++)
{if(check(a,2)==0)continue;
for(a[3]=0;a[3]<8;a[3]++)
{if(check(a,3)==0)continue;
for(a[4]=0;a[4]<8;a[4]++)
{if(check(a,4)==0)continue;
for(a[5]=0;a[5]<8;a[5]++)
{if(check(a,5)==0)continue;
for(a[6]=0;a[6]<8;a[6]++)
{if(check(a,6)==0)continue;
for(a[7]=0;a[7]<8;a[7]++)
{if(check(a,7)==0)continue;
else{for(inti=0;i<8;i++)
{
aa.Format("%d",a[i]);
bb+=aa+"";
}
m_list.AddString(bb);bb="";
count++;}}}}}}}}
aa.Format("%d",count);
MessageBox("总共有组合数:
"+aa);}
intCEight2Dlg:
:
check(inta[],intn)
{inti;
for(i=0;i if((abs(a[i]-a[n])==abs(i-n))||(a[i]==a[n])) return(0); return (1);} 结果输出: 实验题目: 动态规划最大盈利 问题分析: 5台机器3个工厂,求总利润最大的方案。 三个工厂获得的机器数、利润之间都是不独立的,不能用分治和贪婪算法求解,每一种阶段都要在全面考虑各种情况之后,做出必要的决策,因此此题应用动态规划求解。 数学模型: 依所考虑的工厂数目划分阶段,公分为三个阶段。 线考虑分配给A工厂的机器数与利润之间的关系;第二阶段A,B工厂共同分配的机器数与获得的总利润之间的关系;最后考虑三个工厂共同的情况。 q[]存储每个工厂在获得不同数量的机器是的利润情况, f[]存储当前考虑的项目数下分配不同机器数时的利润 二维数组a[][]存储最大收益的情况下每个工厂分配的机器数。 算法策略的选择: 动态规划 程序流程图: 算法时间复杂度分析: 程序实现: voidCFactoryDlg: : OnCancel() {intq[6],temp[6],gain[6]; inta[3][6];//记录最大利润时给第i个工厂分配的机器数 intm=3;//工厂数 intn=5;//机器数 intA[3][6]={0,3,7,9,12,13,0,5,10,11,11,11,0,4,6,11,12,12}; intf[6]={0,3,7,9,12,13}; for(inti=0;i for(intk=1;k<3;k++) {for(intj=0;j {temp[j]=f[j];q[j]=A[k][j];a[k][j]=0;} for(j=0;j<6;j++) for(i=0;i<=j;i++) if(f[j-i]+q[i]>temp[j]) {temp[j]=f[j-i]+q[i];a[k][j]=i;} for(j=0;j<6;j++)f[j]=temp[j]; } intrest=5; for(i=2;i>=0;i--) {gain[i]=a[i][rest];rest=rest-gain[i];} CStringresult,aa; aa.Format("%d",gain[0]); result+="A厂分配"+aa+"台"; aa.Format("%d",gain[1]); result+="B厂分配"+aa+"台"; aa.Format("%d",gain[2]); result+="C厂分配"+aa+"台"; aa.Format("%d",f[5]); result+="总利润是: "+aa; MessageBox(result); } 结果: 总结: 实验题目: 矩阵连乘 问题分析: 不同顺序的矩阵相乘运算,虽然运算结果相同,但所作的乘法次数差距很大。 找到不同的组合方式下矩阵相乘的最少乘法次数,并用所得到的矩阵相乘的顺序计算矩阵相乘的结果。 数学模型: 动态规划的阶段是以相乘的矩阵的个数划分的; 出事状态为一个矩阵相乘的计算量; 第二阶段为两个矩阵相乘 …………….. 最后一个阶段,是n个矩阵相乘的情况。 com[]记录矩阵相乘的结合方式; m[][]记录乘法次数 算法策略的选择: 动态规划 流程图: 算法的时间复杂度: 程序实现: voidCMatrixDlg: : OnButton1() {//寻找乘机数最少的乘法 intn,i,j;//n为矩阵的个数 CStringcou,s1,s2,std; GetPrivateProfileString("count","count","",cou.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); n=atoi(cou);//获取矩阵的个数 for(i=0;i {std.Format("%d",i); GetPrivateProfileString(std,"size1","",s1.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); r[i]=atoi(s1);} std.Format("%d",--i); GetPrivateProfileString(std,"size2","",s1.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); r[i+1]=atoi(s1); for(i=0;i for(j=0;j {com[i][j]=0;m[i][j]=-1;} course(0,n-1);std.Format("%d",m[0][n-1]);m_cishu=std;CStringaa,bb; for(i=0;i {for(j=0;j {std.Format("%d",com[i][j]);aa+=std+"";} m_list2.InsertString(i,aa);aa="";}UpdateData(false);} intCMatrixDlg: : course(inti,intj) {intu,k,t; if(m[i][j]>=0)returnm[i][j]; if(i==j)return0; if(i==j-1) {com[i][i+1]=i;m[i][j]=r[i]*r[i+1]*r[i+2];returnm[i][j];} u=course(i,i)+course(i+1,j)+r[i]*r[i+1]*r[j+1];com[i][j]=i; for(k=i+1;k {t=course(i,k)+course(k+1,j)+r[i]*r[k+1]*r[j+1]; if(t {u=t;com[i][j]=k;} }m[i][j]=u;returnu;} voidCMatrixDlg: : OnButton2() {//实现量矩阵相乘 CStringcou;intc; GetPrivateProfileString("count","count","",cou.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); c=atoi(cou);//获取矩阵的个数 intW[400],len,m,n,p,k=0;CStringstr,std,s1,s2,s3,buffer=""; for(inti=0;i {std.Format("%d",i);GetPrivateProfileString(std,"size1","",s1.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini");GetPrivateProfileString(std,"size2","",s2.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); GetPrivateProfileString(std,"Mat","",str.GetBuffer(MAX_PATH),MAX_PATH,".\\Matrix.ini"); str.ReleaseBuffer(); len=str.GetLength(); m=atoi(s1);n=atoi(s2); for(intj=0;j {if(str[j]! =',')buffer+=str[j]; else{W[k]=atoi(buffer);buffer="";k++;}} for(intt1=0;t1 for(intt2=0;t2 M[i].a[t1][t2]=W[n*t1+t2]; M[i].s1=m;M[i].s2=n; }JiSuan(0,c-1);CStringresult,aa,bb; for(intt1=0;t1 {for(intt2=0;t2 {bb.Format("%d",M[0].a[t1][t2]);aa+=bb+"";} m_list.InsertString(t1,aa);aa=""; }} intCMatrixDlg: : JiSuan(inta,intb) {if(a==b-1)Double(a,b); elseif(a==b){} else {JiSuan(a,com[a][b]);JiSuan(com[a][b]+1,b);Double(a,com[a][b]+1);}return1; } voidCMatrixDlg: : Double(inta,intb) {intbuf[20][20]; for(intt1=0;t1<20;t1++) for(intt2=0;t2<20;t2++)buf[t1][t2]=0; for(inti=0;i for(intj=0;j for(intk=0;k buf[i][j]+=M[a].a[i][k]*M[b].a[k][j]; for(intt3=0;t3 for(intt4=0;t4 M[a].a[t3][t4]=buf[t3][t4];M[a].s2=M[b].s2; } 结果: 结论:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法实验 八皇后问题 算法 实验 皇后 问题