链接:http://codeforces.com/problemset/problem/669/C
http://www.cnblogs.com/Ash-ly/p/5443155.html
题意:
给你一个N*M的矩阵,有三种操作:
1 r 代表把第r行整体左移一位,第一个到最后一个位置.
2 l 代表把第l列整体上移一位,第一个到最底下的位置.
3 x y v 代表此刻第 x 行第 y 列的值为 v.
给你一系列的操作,让你给出满足要求的原始矩阵,如果有多个答案,其中任意一个都可以.
思路:
既然一个矩阵 Q 经过一系列的操作 p1, p2, p3, p4, ..., pn 变成了 Z,那么 Z 经过 pn, ..., p4, p3, p2, p1 也可以恢复到 Q,那么这道题就解决了,只不过对于命令 1 和 2 需要把方向反过来,对于命令 3,直接对相应的位置进行赋值就好了.
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int MAXN = 100; 5 const int MAXQ = 10000; 6 int arr[MAXN + 7][MAXN + 7]; 7 int n, m, q; 8 9 struct Order 10 { 11 int ord; 12 int aa; 13 int bb; 14 int cc; 15 }od[MAXQ + 7]; 16 17 void righmv(int low) 18 { 19 for(int i = m + 1; i >= 2; --i) 20 arr[low][i] = arr[low][i - 1]; 21 arr[low][1] = arr[low][m + 1]; 22 } 23 24 void downmv(int line) 25 { 26 for(int i = n + 1; i >= 2; --i) 27 arr[i][line] = arr[i - 1][line]; 28 arr[1][line] = arr[n + 1][line]; 29 } 30 31 int main() 32 { 33 // freopen("input.txt", "r", stdin); 34 scanf("%d%d%d", &n, &m, &q); 35 memset(&od, 0, sizeof(Order)); 36 for(int i = 0; i < q; i++) 37 { 38 scanf("%d", &od[i].ord); 39 if(od[i].ord != 3) scanf("%d", &od[i].aa); 40 else scanf("%d%d%d", &od[i].aa, &od[i].bb, &od[i].cc); 41 } 42 for(int i = q - 1; i >= 0; --i) 43 { 44 if(od[i].ord == 1) 45 righmv(od[i].aa); 46 else if(od[i].ord == 2) 47 downmv(od[i].aa); 48 else 49 arr[od[i].aa][od[i].bb] = od[i].cc; 50 } 51 for(int i = 1; i <= n; i++) 52 { 53 for(int j = 1; j <= m; j++) 54 printf(j == 1 ? "%d":" %d", arr[i][j]); 55 printf("\n"); 56 } 57 return 0; 58 }