bushangxian2 2016-10-07 08:37 采纳率: 0%
浏览 1187
已结题

位运算解决8皇后问题,怎么输出解法呢

 #include <stdio.h>
#include <stdlib.h>
int sum = 0,,upperlim = (1 << 8) - 1;
test(short row, short ld, short rd) {
        if (row != upperlim) {
            // row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,
            // 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1
            // 也就是求取当前哪些列可以放置皇后
            short pos = upperlim & ~(row | ld | rd);//所有可以放的位置
            while (pos != 0) // 0 -- 皇后没有地方可放,回溯
            {
                // 拷贝pos最右边为1的bit,其余bit置0
                // 也就是取得可以放皇后的最右边的列
                short p = pos & -pos;//最右边的位置

                // row + p,将当前列置1,表示记录这次皇后放置的列。
                // (ld + p) << 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
                // (ld + p) >> 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
                // 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
                // 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
                // 在每次选择列之前进行,原来N×N网格中某个已放置的皇后针对其对角线
                // 上产生的限制都被记录下来了
                test(row + p, (ld + p) << 1, (rd + p) >> 1);
                // 将pos最右边为1的bit清零
                // 也就是为获取下一次的最右可用列使用做准备,
                // 程序将来会回溯到这个位置继续试探
                pos -= p;
            }
        } else {
            // row的所有位都为1,即找到了一个成功的布局,回溯

            sum++;
            printf("这是第%d种解决方案.\n",sum); 
        }
    }


int main()
{
    test(0, 0, 0);
    printf("总共有 %d 种解决方法!\n\n", sum);

    return 0;
}

最近学习位运算,不过用位运算解决8皇后问题怎么输出全部解法呢

  • 写回答

2条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog