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.