Description
Alice有一个N*N的格子,把1-N^2按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:
(1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
(2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
Alice想把数X移到(R,C)处可以采用以下方法:
•如果X不在C这一列,通过旋转行操作把X移到C这一列;
•如果X不在R这一行,通过旋转列操作把X移到R这一行。
下面是一个把6移到(3,4)的例子:
Alice现在想采用上述方法,依次把K个数移到各自的目标位置,编程计算每个数需要几次操作。
Input
第一行包含两个整数N(12<=N<=10000)和K(1<=K<=1000)。
接下来K行,每行包含三个整数X(1<=X<=N^2)、R和C(1<=R,C<=N),描述需要移动的数以及目标位置。
Alice必须按照输入顺序依次移动。
Output
输出K行,每行输出一个整数,表示操作次数。
翔法
记录每次操作后数字的位置和操作内容,根据同行同列数字的移动改变当前数字的位置
暴力出奇迹
代码
var
n,m,f:longint;
x,y,s,t:array[1..1001]of longint;
i,j:longint;
h,l:Longint;
begin
readln(n,m);
for i:=1 to m do
begin
readln(f,x[i],y[i]);
h:=f div n;
l:=f mod n;
if l=0 then l:=n
else
inc(h);
for j:=1 to i-1 do
begin
if x[j]=h then l:=(l+s[j])mod n;
if l=0 then l:=n;
if y[j]=l then h:=(h+t[j])mod n;
if h=0 then h:=n;
end;
s[i]:=y[i]-l;
if s[i]<0 then s[i]:=s[i]+n;
t[i]:=x[i]-h;
if t[i]<0 then t[i]:=t[i]+n;
x[i]:=h;
writeln(s[i]+t[i]);
end;
end.