您的位置:首页 > 其它

CodeForces 669C

2016-04-28 16:29 225 查看
链接:http://codeforces.com/problemset/problem/669/C
http://www.cnblogs.com/Ash-ly/p/5443155.html
[b]题意:[/b]

  给你一个N*M的矩阵,有三种操作:

  1 r 代表把第r行整体左移一位,第一个到最后一个位置.

  2 l 代表把第l列整体上移一位,第一个到最底下的位置.

  3 x y v 代表此刻第 x 行第 y 列的值为 v.

  给你一系列的操作,让你给出满足要求的原始矩阵,如果有多个答案,其中任意一个都可以.

[b]思路:[/b]

  既然一个矩阵 Q 经过一系列的操作 p1, p2, p3, p4, ..., pn 变成了 Z,那么 Z 经过 pn, ..., p4, p3, p2, p1 也可以恢复到 Q,那么这道题就解决了,只不过对于命令 1 和 2 需要把方向反过来,对于命令 3,直接对相应的位置进行赋值就好了.

[b]代码:[/b]

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100;
const int MAXQ = 10000;
int arr[MAXN + 7][MAXN + 7];
int n, m, q;

struct Order
{
int ord;
int aa;
int bb;
int cc;
}od[MAXQ + 7];

void righmv(int low)
{
for(int i = m + 1; i >= 2; --i)
arr[low][i] = arr[low][i - 1];
arr[low][1] = arr[low][m + 1];
}

void downmv(int line)
{
for(int i = n + 1; i >= 2; --i)
arr[i][line] = arr[i - 1][line];
arr[1][line] = arr[n + 1][line];
}

int main()
{
//     freopen("input.txt", "r", stdin);
scanf("%d%d%d", &n, &m, &q);
memset(&od, 0, sizeof(Order));
for(int i = 0; i < q; i++)
{
scanf("%d", &od[i].ord);
if(od[i].ord != 3) scanf("%d", &od[i].aa);
else    scanf("%d%d%d", &od[i].aa, &od[i].bb, &od[i].cc);
}
for(int i = q - 1; i >= 0; --i)
{
if(od[i].ord == 1)
righmv(od[i].aa);
else if(od[i].ord == 2)
downmv(od[i].aa);
else
arr[od[i].aa][od[i].bb] = od[i].cc;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
printf(j == 1 ? "%d":" %d", arr[i][j]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: