Section 1.5 Checker Challenge
2010-08-23 19:58
344 查看
这是个典型的n皇后问题 参见百度百科
8皇后问题 http://baike.baidu.com/view/622604.htm
然后用一个链表技术加以优化即可
http://blog.csdn.net/YY19970227/archive/2010/08/23/5832012.aspx
也就是我转载的那个
{
ID: yaoyuan4
PROG: checker
LANG: PASCAL
}
Program checker;
const
maxn = 15; inf = 'checker.in'; outf = 'checker.out';
type
borad = array[-maxn..2*maxn] of boolean;
list = record
prior, next : longint;
end;
var
ans : array[0..maxn] of longint;
f : array[0..maxn] of list;
a, b : borad;
n, total : longint;
Procedure init;
var
i : longint;
begin
assign(input, inf); reset(input);
readln(n);
close(input);
fillchar(a, sizeof(a), false);
fillchar(b, sizeof(b), false);
fillchar(ans, sizeof(ans), 0);
total := 0;
for i := 1 to n do
begin
f[i].prior := i-1;
f[i].next := i+1;
end;
f[n+1].prior := n;
f[0].next := 1;
end;
Procedure print;
var
i : longint;
begin
write(ans[1]);
for i := 2 to n do
write(' ',ans[i]);
writeln;
end;
Procedure tryi(op : longint);
var
i : longint;
begin
if op > n then
begin
inc(total);
if total <= 3 then print;
exit;
end;
i := 0;
repeat
i := f[i].next;
if i > n then exit;
if (not(a[op+i])) and (not(b[op-i])) then
begin
ans[op] := i;
f[f[i].prior].next := f[i].next;
f[f[i].next].prior := f[i].prior;
a[op+i] := true;
b[op-i] := true;
tryi(op+1);
a[op+i] := false;
b[op-i] := false;
f[f[i].prior].next := i;
f[f[i].next].prior := i;
end;
until false;
end;
Procedure work;
begin
assign(output, outf); rewrite(output);
tryi(1);
writeln(total);
close(output);
end;
begin
init;
work;
end.
USACO 1终于做完了 庆贺庆贺!
8皇后问题 http://baike.baidu.com/view/622604.htm
然后用一个链表技术加以优化即可
http://blog.csdn.net/YY19970227/archive/2010/08/23/5832012.aspx
也就是我转载的那个
{
ID: yaoyuan4
PROG: checker
LANG: PASCAL
}
Program checker;
const
maxn = 15; inf = 'checker.in'; outf = 'checker.out';
type
borad = array[-maxn..2*maxn] of boolean;
list = record
prior, next : longint;
end;
var
ans : array[0..maxn] of longint;
f : array[0..maxn] of list;
a, b : borad;
n, total : longint;
Procedure init;
var
i : longint;
begin
assign(input, inf); reset(input);
readln(n);
close(input);
fillchar(a, sizeof(a), false);
fillchar(b, sizeof(b), false);
fillchar(ans, sizeof(ans), 0);
total := 0;
for i := 1 to n do
begin
f[i].prior := i-1;
f[i].next := i+1;
end;
f[n+1].prior := n;
f[0].next := 1;
end;
Procedure print;
var
i : longint;
begin
write(ans[1]);
for i := 2 to n do
write(' ',ans[i]);
writeln;
end;
Procedure tryi(op : longint);
var
i : longint;
begin
if op > n then
begin
inc(total);
if total <= 3 then print;
exit;
end;
i := 0;
repeat
i := f[i].next;
if i > n then exit;
if (not(a[op+i])) and (not(b[op-i])) then
begin
ans[op] := i;
f[f[i].prior].next := f[i].next;
f[f[i].next].prior := f[i].prior;
a[op+i] := true;
b[op-i] := true;
tryi(op+1);
a[op+i] := false;
b[op-i] := false;
f[f[i].prior].next := i;
f[f[i].next].prior := i;
end;
until false;
end;
Procedure work;
begin
assign(output, outf); rewrite(output);
tryi(1);
writeln(total);
close(output);
end;
begin
init;
work;
end.
USACO 1终于做完了 庆贺庆贺!
相关文章推荐
- USACO section 1.5 Checker Challenge(dfs深搜)
- USACO Section 1.5 Checker Challenge - 普普通通的皇后问题~~
- USACO section 1.5 Checker Challenge(dfs深搜)
- usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)
- Checker Challenge chapter 1.5
- USACO1.5 Checker Challenge(类n皇后问题)
- USACO Section 1.5 Checker Challenge
- USACO-cha1-sec1.5 Checker Challenge
- USACO sec1.5 Checker Challenge
- USACO 1.5 Checker Challenge (checker)
- USACO Section 1.5 Checker Challenge(八皇后问题)
- USACO Section 1.5: Prob Checker Challenge
- USACO Section 1.5 Checker Challenge
- USACO Section 1.5: Checker Challenge
- USACO 1.5 Checker Challenge (DFS)
- USACO 1.5 Checker Challenge (DFS + 剪枝)
- USACO 1.5 Checker Challenge
- USACO 1.5 Checker Challenge (位操作)
- USACO 1.5 Checker Challenge(DFS)
- USACO 1.5 Checker Challenge