如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
URAL/1034
来自"NOCOW"
< URAL
由于一开始,输入数据就已是和平状态,所以我们枚举3个要换的点,这三个只能是行行交换(列列交换是一样的),行行交换打个比方,三个坐标为(a,i),(b,j),(c,k)交换后是(b,i),(c,j),(a,k) 或(c,i),(a,j),(b,k)(因为,三个坐标都必须换),如果用其他的交换方式,一定会导致列的不和平(即一列上有多个皇后),接着只要判断对角线是否和平即可.
program ural1034; const maxn=55; var data:array[0..maxn] of longint; a,b,c,d,e,f,g,h,i,j,k,l,n,m,p,q,ans:longint; procedure change(var a,b,c:longint); var tmp:longint; begin tmp:=a; a:=b; b:=c; c:=tmp; end; procedure check(a,b,c:longint); var i:longint; begin for i:=1 to n do begin if (i<>a)and(abs(data[i]-data[a])=abs(i-a)) then exit; if (i<>b)and(abs(data[i]-data[b])=abs(i-b)) then exit; if (i<>c)and(abs(data[i]-data[c])=abs(i-c)) then exit; end; inc(ans); end; procedure init; begin read(n); for i:=1 to n do read(k,data[k]); ans:=0; end; procedure main; begin for i:=1 to n-2 do for j:=i+1 to n-1 do for k:=j+1 to n do begin change(data[i],data[j],data[k]); check(i,j,k); change(data[i],data[j],data[k]); check(i,j,k); change(data[i],data[j],data[k]); end; end; procedure print; begin writeln(ans); end; begin init; main; print; end.