2011-06-16 18:17:49Morris
d543. 挑战极限 Part7:强大的N皇后
http://zerojudge.tw/ShowProblem?problemid=d543
內容 :
大家都AC过8皇后问题吧,好多人都说是水题。
看来要把它加强一丁点,也许就有点嚼头了!
今天的任务就是要在一个N*N的国际棋盘上,放置N个皇后,使之不能互相攻击,问有多少种方法。
輸入說明
:
每行都有一个N(0<N<16)。时限不能放宽,等时间放宽之后,测资加强,但N总不会超过20。
輸出說明
:
对于每组测试数据,输出相应的方法数。
注:可能有0哟!
範例輸入 :
8
範例輸出 :
92
提示
:
背景知識:
8皇后
8皇后加强版。
小心TLE哟!
限制时间10s,限制空间128MB,应该够了吧
别打表!若发现打表,测试数据大大的加强###
为了防止测试数据外泄,测试结果不公开,但是告诉你第一组输入测试数据,就是第N行的数据是N.
第二组很强大的!
###时间很紧,大家挑战极限吧!!!
出處
:
N皇后问题的终极优化
(管理:liouzhou_101)
作法 : bitmask
說明請參照 .
http://maplewing.blogspot.com/2011/03/uva11195another-n-queen-problem.html
作法 : bitmask
說明請參照 .
http://maplewing.blogspot.com/2011/03/uva11195another-n-queen-problem.html
/**********************************************************************************/
/* Problem: d543 "挑战极限 Part7:强大的N皇后" from N皇后问题的终极优化*/
/* Language: C */
/* Result: AC (2302ms, 268KB) on ZeroJudge */
/* Author: morris1028 at 2011-06-16 12:39:01 */
/**********************************************************************************/
#include<stdio.h>
#include<stdlib.h>
int y_row[16], Ans;
void backtracking(int n, int y, int x, int slash1, int slash2) {
if(y == n) {Ans++; return ;}
int nowslash1 = slash1 >> y;
int nowslash2 = slash2 >> (n-y-1);
int judge = y_row[y] & x & nowslash1 & nowslash2;
int xput;
while(judge) {
xput = judge & (-judge); /*lowbit*/
backtracking(n, y+1, x^xput, slash1^(xput<<y), slash2^(xput<<(n-y-1)));
judge ^= xput;
}
}
main() {
int n, a, b;
char s[16];
while(scanf("%d", &n) == 1 && n) {
for(a = 0; a < n; a++) {
y_row[a] = (1<<n)-1;
}
Ans = 0;
backtracking(n, 0, (1<<n)-1, (1<<(2*n-1))-1, (1<<(2*n-1))-1);
printf("%d\n", Ans);
}
return 0;
}
上一篇:a068. E. 看動畫 加强版
下一篇:[JAVA] a001. 哈囉