n皇后问题的随机解法代码实现【DOC精选】.docx

n皇后问题的随机解法代码实现【DOC精选】.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
n皇后问题的随机解法代码实现【DOC精选】

n皇后问题的随机解法实验要求:运用随机算法和回溯法对皇后问题进行求解。先用随机算法预先对一部分皇后随机出其位置,对剩余的皇后,用回溯法求才出合理的位置。实验步骤:定义初始标记。int *s=new int[n+1];用随机算法求出一部分皇后的位置时,用s进行标记,s[i]=1表示第i个皇后的位置已经确定。Int *x=new int[n+1]; x[i]表示第i个皇后的位置验证皇后的位置是否可行函数(利用标记x),函数代码如下bool place(int x[],int k,int n){int i;for(i=1;i=n;i++)if(x[i]!=0i!=k)if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))return false;return true;}随机算法过程。在用户输入皇后个数后,用户可自定义那些皇后先进行定位,也可以停止随机过程,进入到回溯过程。回溯法,(这时要考虑一部分的皇后已确定位置,利用s标记)用print函数输出可行的皇后位置图。代码实现:#include iostream#include ctime#include cstdlib#include math.husing namespace std;bool place(int x[],int k,int n) //判别皇后位置是否可行{int i;for(i=1;i=n;i++)if(x[i]!=0i!=k)if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))return false;return true;}void print(int x[],int n) //以矩阵的形式输出皇后的位置图{int i,j;int **xx=new int *[n+1];for(i=1;i=n;i++)xx[i]=new int[n+1];for(i=1;i=n;i++)for(j=1;j=n;j++){xx[i][j]=0;if(j==x[i])xx[i][j]=1;}for(i=1;i=n;i++){cout\n;for(j=1;j=n;j++){coutxx[i][j] ;}}cout\n;}/*****************************************************************************/void queen(int n,int x[],int s[]) //回溯法过程{bool T=true;int i,k=1;for(i=1;i=n;i++)if(s[i]==0) break;k=i;while(k=i){x[k]++;while(x[k]=n){if(place(x,k,n))if(k==n) {print(x,n);T=false;break;x[k]++;}else {do{k++;}while(s[k]==1);x[k]=1;}else x[k]++;}if(T==false)break;x[k]=0;do{k--;}while(s[k]==1);}if(ki)cout回溯法后找不到可行的皇后位置;}/***************************************************************************************/int main(){int n,n0,i; //n0 是每次皇后定位的随机次数cout请输入皇后的数目:;cinn;cout皇后数目为n\n\n;int *x=new int[n+1];for(i=1;i=n;i++)x[i]=0;int *s=new int[n+1];for(i=1;i=n;i++)s[i]=0; //s为随机时固定的皇后标记,当其值为1时表示为改皇后已固定位置,在回溯法在要相应跳过//随机过程cout随机过程:\n;int k=1;int r;bool T;while(k) //是否结束随机过程,当输入k值为0时停止随机法{cout请输入随机第几个皇后:;cink;n0=1;while(n050){srand(time(0)+n0);r=rand()%n+1;//随机产生1到n的数x[k]=r;if(place(x,k,n)) //判断随机的位置时否可行{cout 找到第k个皇后的位置为: r\n;s[k]=1; //可行,讲s[i]的值设为1T=true;for(i=1;i=n;i++)if(s[i]!=1) T=false;if(T)print(x,n);//找到可行的解break;}n0++;}if(n0==50){x[k]=0;cout找不到第k个皇后的位置;}cout是

文档评论(0)

taotao0b + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档