n皇后问题

经典问题

题目大意:对于一个n*n的矩阵,每条横线竖线斜线上都只能放一个皇后,求方案。

用搜索即可,但是如果一个格子一个格子地枚举肯定会超时,所以考虑枚举每一行放的情况,但是要注意判断斜线上合不合法的情况,下面就是一种很好的方法。

可知对于一个矩阵有如下特性,每条红色线上i-j的值相同,每条蓝线上i+j的值相同,并且它们的i+j或i-j的值都是不重复的。

那么设置一个数组f1记录蓝色斜线,数组f2记录红色斜线,放第i行第j个的时候直接判断f1[i+j]和f2[i-j]有没有放。

program Neayo;
const
        inf='queen.in';
        ouf='queen.out';
var
        i,j,k,n:longint;
        line,h:array[0..11]of longint;
        f1,f2:array[-10..25]of boolean;
        a:array[0..11,0..11]of longint;
procedure init;
begin
     assign(input,inf);assign(output,ouf);
     reset(input);rewrite(output);
     readln(n);
     close(input);
end;
procedure go(x:longint);
var i,j,xi,xj:longint;
    emp:boolean;
begin
     if x=n+1 then
     begin
          for i:=1 to n do write(line[i],' ');
          writeln;
          exit;
     end;
     for j:=1 to n do
     if (h[j]=0)and(not f1[x+j])and(not f2[x-j]) then
     begin
          f1[x+j]:=true;
          f2[x-j]:=true;
          line[x]:=j;
          h[j]:=1;
          go(x+1);
          f1[x+j]:=false;
          f2[x-j]:=false;
          line[x]:=0;
          h[j]:=0;
     end;
end;
begin
     init;
     if n=1 then writeln(1);
     if (n=2)or(n=3) then writeln(' ');
     if n>3 then go(1);
     close(output);
end.                               
posted @ 2012-10-12 11:14  neayo  阅读(158)  评论(0编辑  收藏  举报