N皇后问题

经典八皇后问题:
在8×8的国际象棋棋盘上摆放8个皇后,但是皇后之间不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
由规则可知,8个皇后一定是放置在不同的行。可以尝试从第一行开始选择1列放置一个皇后,然后再第二行,但是第二行选择放置皇后不能与之前冲突,直到第八个皇后放置好之后得到一种放置方法。
通过深度搜索的方法,计算出所有的解决方法。
问题的关键是如何判断放置的皇后与之前的冲突:
用col, ld, rd三个int型变量的最后8位表示每一行的冲突情况;

这里写图片描述
上图为6皇后问题的示例:
第4行放置前:col = 101010, ld = 100100,rd = 000111,只有当所有col, ld, rd的同一位都为0,才能放置皇后。
第4行放置后:col = 111010, ld = 110100,  rd = 010111,两条对角线对下一行的影响分别是,ld << 1, rd >>1。
第5行放置前:col = 111010, ld = 101000, rd = 001011。

链接:HDU N皇后

#include <stdio.h>
#define N 10
int cnt;
void dfs(int cur, int n, int col, int ld, int rd) {
    if(cur == n)
        cnt++;
    else {
        int t = 1;
        int mask = col | ld | rd;
        for(int i = 0; i < n; i++) {
            t = 1 << i;
            if(~mask & t) {
                dfs(cur+1, n, col|t, (ld|t)<<1, (rd|t)>>1);
            }
        }
    }
}
int main() {
    int n, num[N];
    for(int i = 0; i < N; i++) {
        cnt = 0;
        dfs(0, i+1, 0, 0, 0);
        num[i] = cnt;
    }
    while(scanf("%d", &n) != EOF) {
        if(n == 0)
            break;
        printf("%d\n", num[n-1]);
    }
    return 0;
}
下载前必看:https://pan.quark.cn/s/a4b39357ea24 在本资料中,将阐述如何运用JavaScript达成单击下拉列表框选定选项后即时转向对应页面的功能。 此种技术适用于网页布局中用户需迅速选取并转向不同页面的情形,诸如网站导航栏或内容目录等场景。 达成此功能,能够显著改善用户交互体验,精简用户的操作流程。 我们须熟悉HTML里的`<select>`组件,该组件用于构建一个选择列表。 用户可从中选定一项,并可引发一个事件来响应用户的这一选择动作。 在本次实例中,我们借助`onchange`事件监听器来实现当用户在下拉列表框中选定某个选项时,页面能自动转向该选项关联的链接地址。 JavaScript里的`window.location`属性旨在获取或设定浏览器当前载入页面的网址,通过变更该属性的值,能够实现页面的转向。 在本次实例的实现方案里,运用了`eval()`函数来动态执行字符串表达式,这在现代的JavaScript开发实践中通常不被推荐使用,因为它可能诱发安全问题及难以排错的错误。 然而,为了本例的简化展示,我们暂时搁置这一问题,因为在更复杂的实际应用中,可选用其他方法,例如ES6中的模板字符串或其他函数来安全地构建和执行字符串。 具体到本例的代码实现,`MM_jumpMenu`函数负责处理转向逻辑。 它接收三个参数:`targ`、`selObj`和`restore`。 其中`targ`代表要转向的页面,`selObj`是触发事件的下拉列表框对象,`restore`是标志位,用以指示是否需在转向后将下拉列表框的选项恢复至默认的提示项。 函数的实现通过获取`selObj`中当前选定的`selectedIndex`对应的`value`属性值,并将其赋予`...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值