如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1034

来自"NOCOW"

跳转到: 导航, 搜索

由于一开始,输入数据就已是和平状态,所以我们枚举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.
个人工具