鱼C论坛

 找回密码
 立即注册
查看: 4034|回复: 7

八皇后问题 问题求助

[复制链接]
发表于 2014-4-17 18:02:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 杨延平 于 2014-4-17 20:43 编辑

刚刚看了小甲鱼老师的视频 不懂  打算代码敲下来调试再理解理解  争取理解递归  现在有个问题求各位大神解决

1:递归解八皇后问题就是暴力枚举每一种结果看合适不合适吗?
2: 如果第一个问题是显然的,,为什么对于所有的行都枚举了(代码10处)  但在主函数只调用了一次EightQueen(0,8,chess);
而不是  调用8次呢

1.        if (8 == row){
2.        输出棋盘
3.        }
4.        else{
5.                //判断这个位置是否有危险
6.                //如果没有危险
7.                        for (j = 0; j < n; j++){
8.                                if (notDanger(row,j,chess2)){
9.                                标记为皇后的位置为1
10.                                        EightQueen(row + 1, n, chess2);//这里对于row+1  行的所有列进行了枚举
11.                        }
12.                }        
13.        }
14.}

再次看了一遍代码  发现是我自己二逼了  我这么问也证明我懂了这个整体的思想
马上自己敲一遍  且桥且珍惜

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-18 19:18:13 | 显示全部楼层
这个必须要看看那啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-18 21:33:12 | 显示全部楼层
其实在第七行就是在判断  棋盘中第一行的每个字是否安全  然后如果安全 则开始一条以第一行某个列的一种可能 然后再递归第二行  同样  递归的每个节点都先8个节点访问 然后再递归   最后每个节点都遍历到了
把8^8种结果都尝试了一遍   然后筛选出92种
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 16:22:46 | 显示全部楼层
回溯只需要用8!次来解。。。4万次计算而已。。

8^8可是1千600多万种结果。。这是穷举的方法。。不是递归
递归和穷举有区别。这个在放皇后之前有用notDanger去查是否可以放,不可以放就直接跳过该格子。具体多少次计算我也不大会算。但这绝对不是穷举的方法。

附上我学过的代码。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>

  4. int row[8];
  5. int tc,a,b,solc;


  6. bool place (int r, int c){
  7.         for (int prev=0;prev<c;prev++){
  8.                 if (row[prev]==r||(abs(prev-c)==abs(row[prev]-r)))return false;
  9.         }
  10.         return true;
  11. }

  12. void backtrack(int n){
  13.         if (n==8){
  14.                 printf("第%d种\n",++solc);
  15.                 for (int j=0;j<8;j++){
  16.                         for (int i=0;i<8;i++){
  17.                                 if (row[i]==j)printf ("1 ");
  18.                                 else printf("0 ");
  19.                         }
  20.                         printf("\n");
  21.                 }
  22.                
  23.         }
  24.        
  25.         for (int r=0;r<8;r++){
  26.                 if (place(r,n)){
  27.                         row[n]=r;
  28.                         backtrack(n+1);
  29.                 }
  30.         }
  31.        
  32. }
  33. int main()
  34. {
  35.                 memset(row,0,sizeof(row));
  36.                 solc=0;
  37.                 backtrack(0);
  38.         return 0;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 12:40:16 | 显示全部楼层
首先不是暴力枚举
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-3 17:29:46 | 显示全部楼层
确实是值得思考的一个问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-4 00:52:54 | 显示全部楼层
确实是值得思考的一个问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 16:03:12 | 显示全部楼层
撒打算打算打算的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表