Alice有一个N*N的格子,把1-N^2按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:
(1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
(2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
Alice想把数X移到(R,C)处可以采用以下方法:
•如果X不在C这一列,通过旋转行操作把X移到C这一列;
•如果X不在R这一行,通过旋转列操作把X移到R这一行。
下面是一个把6移到(3,4)的例子:
(1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
(2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
Alice想把数X移到(R,C)处可以采用以下方法:
•如果X不在C这一列,通过旋转行操作把X移到C这一列;
•如果X不在R这一行,通过旋转列操作把X移到R这一行。
下面是一个把6移到(3,4)的例子:
Alice现在想采用上述方法,依次把K个数移到各自的目标位置,编程计算每个数需要几次操作。
题解
每一个点如果移动了,与它同行或同列的点也要移动,用数组记录下来,每输入一个点,枚举之前有关这个店的操作,合在一起,判断输出。
这题告诉我们记得把暴力写优美。
代码
var
f:array[0..10000,1..2]of longint;
a,b,c:array[0..10000]of longint;
k,n:longint;
procedure init;
var
i:longint;
begin
readln(n,k);
for i:=1 to k do
readln(a[i],b[i],c[i]);
end;
procedure c4;
var
i,p:longint;
begin
for i:=1 to k do
begin
p:=a[i] mod n;
if p<>0 then f[i,1]:=a[i] div n+1
else f[i,1]:=a[i] div n;
if p=0 then p:=n;
f[i,2]:=p;
end;
end;
procedure baozha;
var
i,j,ans,sum:longint;
begin
for i:=1 to k do
begin
if b[i]<f[i,1] then ans:=n-(f[i,1]-b[i])
else ans:=b[i]-f[i,1];
if c[i]<f[i,2] then sum:=n-(f[i,2]-c[i])
else sum:=c[i]-f[i,2];
for j:=i+1 to k do
begin
if f[i,1]=f[j,1] then
begin
f[j,2]:=(f[j,2]+sum) mod n;
if f[j,2]=0 then f[j,2]:=n;
end;
if f[j,2]=c[i] then
begin
f[j,1]:=(f[j,1]+ans)mod n;
if f[j,1]=0 then f[j,1]:=n;
end;
end;
writeln(ans+sum);
end;
end;
begin
init;
c4;
baozha;
end.