Section 1.5 Checker Challenge

来源:互联网 发布:晨曦2013软件视频教程 编辑:程序博客网 时间:2024/06/04 17:50

这是个典型的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终于做完了 庆贺庆贺!