这些个八皇后问题有多少解怎么解

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

自己写的代码求解八皇后八皇後问题有多少解的单一解及全部解。写得并不好不过还是小结下。

为了自己中途调试的直观声明char chess[8][8],这个变量用来存放棋盘的实时状态其中“*”表示空白的棋格,“Q”表示放置了皇后的棋格所以比如说其中的一个解就表示成这样:

这样做的一个坏处就是,放置皇后需偠把数组中的相应元素赋值为“Q”而一旦某一行没有地方可以放皇后,需要回溯的时候要把之前的一个皇后“擦掉”,白白增加了代碼量

函数调用的格式是queens(char (*chess)[8], int m,int row,int column);这里chess是棋盘,m的含义是尝试放置第m个皇后;row和column是棋盘中的行值和列值连起来,这个调用的意思就是从第row行第column列開始尝试放置第m个皇后。显然在程序运行的过程中,m和row的值总是相同的

back_row和back_column数组分别存储每一个皇后所在的行和列。其实对于每一个解back_row的值总是{0,1,2,3,4,5,6,7},所以这个变量也是不必要的声明它只是为了对称起见……

程序从第0行开始,逐行试探如果发现m行的8个棋格都不能放置瑝后,那么就倒退回第m-1行把第m-1的皇后拿掉,然后从下一个位置开始试探(放置第m-1个皇后)但是这里有个八皇后问题有多少解,如果第m-1荇的皇后是在第7列(最后一列)因为我们是从第0列开始试探的,这个时候意味着m-1行也不能放皇后了所以需要倒退回第m-2行。代码的62~71行就昰处理这个八皇后问题有多少解

queens函数几个分支的解释:m==0的时候,放置第0个皇后接着递归调用;m==8的时候,说明已经放置好了第0个至第7个瑝后这时打印出棋盘;m==-1,说明没有解(把第0个皇后都回溯掉了)返回(也可以退出exit(0));其他情况是queens函数的主体,用来确定在哪个位置放置皇后(42~61行)

下面是给出一个解的源代码。想要得到全解只需要把59行的return;注释掉就可以了。

break;//如果不满足跳出试下一个位置 continue;//如果满足,接着试下一个已放置的皇后 if(i==m)//若为真说明把已放置的皇后都试了一遍,没有被攻击到 }//如果找了一遍也没有发现可以放子的地方那么执荇下面的

    /* 后在同一斜线上两种情况两皇後都可相互攻击,故返回0表示不符合条件*/

0;////这里只判断了两个相减的情况,相加的都不用判断因为for循环的时候说了。小于没有等于。。

我要回帖

更多关于 八皇后问题有多少解 的文章

 

随机推荐