Time Limits:
1000 ms Memory Limits: 65536 KB Detailed Limits
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个数移到各自的目标位置,编程计算每个数需要几次操作。
(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必须按照输入顺序依次移动。
接下来K行,每行包含三个整数X(1<=X<=N^2)、R和C(1<=R,C<=N),描述需要移动的数以及目标位置。
Alice必须按照输入顺序依次移动。
Output
输出K行,每行输出一个整数,表示操作次数。
Sample Input
输入1: 4 1 6 3 4 输入2: 4 2 6 3 4 6 2 2 输入3: 5 3 1 2 2 2 2 2 12 5 5
Sample Output
输出1: 3 输出2: 3 5 输出3: 2 5 3
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 1e4+5; 4 const int MAXK = 1e3+5; 5 struct Node { 6 int val, fx, fy; 7 int x, y; 8 }a[MAXK]; 9 int n, k; 10 int main() { 11 cin>>n>>k; 12 for (int i=1; i<=k; i++) { 13 cin>>a[i].val>>a[i].fx>>a[i].fy; 14 --a[i].fx; 15 --a[i].fy; 16 --a[i].val; 17 a[i].x=a[i].val / n; 18 a[i].y=a[i].val % n; 19 } 20 for (int i=1; i<=k; i++) { 21 a[i].fx += (a[i].x > a[i].fx ? n : 0); 22 a[i].fy += (a[i].y > a[i].fy ? n : 0); 23 int tempx=a[i].fx - a[i].x; 24 int tempy=a[i].fy - a[i].y; 25 cout<<tempx+tempy<<endl; 26 for (int j=i; j<=k; j++) { 27 if (a[j].x == a[i].x) { 28 a[j].y = ( a[j].y + tempy ) % n; 29 } 30 } 31 for (int j=i+1; j<=k; j++) { 32 if (a[j].y == a[i].y) { 33 a[j].x = ( a[j].x + tempx ) % n; 34 } 35 } 36 } 37 return 0; 38 }