Grid Rotations

比赛期间写题:好难啊我根本不会啊

比赛之后补题:怎么这么简单?就这(o(╥﹏╥)o)

好吧可能本质还是练题不够,思维和写代码的能力还是没有提升上去

题目来源:AtCoder Regular Contest 153 B

https://atcoder.jp/contests/arc153/tasks/arc153_b

题意:已知一个字符矩阵,给定一个点的坐标,该点坐标左上方、右上方、左下方、右下方的矩阵分别进行180度旋转,然后进行若干次操作(每次操作的给的点的坐标不同)。

思路:在场上想到了一半,推出来坐标为h-i-1(h以上的部分)和H+h-i-1(h以下的部分),但是不知道怎么处理这个H,也想到了奇偶次数会发生正负的变化(指的是i),然后这些都想到了但是我的思路却完全跑了(也是很神奇),然后直接贴代码吧(网上大佬们的代码简单到都不需要我解释o(╥﹏╥)o这就是我与大佬的差距吗)

#include <bits/stdc++.h>
using namespace std;
long long h, w, q, u, v;
pair<long long, long long>a[200010];

int main() {
    cin >> h >> w;
    vector<string>x(h);
    for (int i = 0; i < h; i++)
        cin >> x[i];
    cin >> q;
    for (int i = 0; i < q; i++)
        cin >> a[i].first >> a[i].second;
    for (int i = q - 1; i >= 0; i--)
        u = (a[i].first - 1 - u + h) % h, v = (a[i].second - 1 - v + w) % w;
    for (int i = 0; i < h; i++)
        for (int j = 0; j < w; j++) {
            if (q & 1)
                cout << x[(u - i + h) % h][(v - j + w) % w];
            else
                cout << x[(u + i + h) % h][(v + j + w) % w];
            if (j == (w - 1))
                cout << endl;
        }
}
#include <bits/stdc++.h>
using namespace std;
int main(){
  int H, W;
  cin >> H >> W;
  vector<vector<char>> A(H, vector<char>(W));
  for (int i = 0; i < H; i++){
    for (int j = 0; j < W; j++){
      cin >> A[i][j];
    }
  }
  int Q;
  cin >> Q;
  int x = 0, y = 0;
  for (int i = 0; i < Q; i++){
    int a, b;
    cin >> a >> b;
    if (i % 2 == 1){
      a = H - a;
      b = W - b;
    }
    x += a;
    y += b;
    x %= H;
    y %= W;
  }
  vector<vector<char>> B(H, vector<char>(W));
  for (int i = 0; i < H; i++){
    for (int j = 0; j < W; j++){
      if (Q % 2 == 0){
        B[i][j] = A[(i + x) % H][(j + y) % W];
      } else {
        B[H - 1 - i][W - 1 - j] = A[(i + x) % H][(j + y) % W];
      }
    }
  }
  for (int i = 0; i < H; i++){
    for (int j = 0; j < W; j++){
      cout << B[i][j];
    }
    cout << endl;
  }
}

题目二:矩阵变化

题目来源:河北省省赛选拔赛(二)及某年女生赛选拔赛

题意大致就是给矩阵,然后每次左右对称翻转或者上下对称翻转(给定翻转的范围)

#include<bits/stdc++.h>
using namespace std;
#define min(x,y) ((x)<(y) ? (x):(y))
#define f(i,j,k) for(int i=(j);i<=(k);i++)
#define g(i,j,k) for(int i=(k);i>=(j);i--)
#define PR pair<int,int>    
#define mk(x,y) make_pair(x,y)

const int mod=1e9+7;

int n,m,q,now=0;
char p[2][505][505];

signed main(){
    cin>>n>>m>>q;
    f(i,1,n) cin>>(p[0][i]+1);
    int x,a,b,c,d;
    while(q--){
        cin>>x>>a>>b>>c>>d;
        if(x==1){
            f(y,1,n){
                f(x,1,m){
                    if(y>=a && y<=b && x>=c && x<=d) putchar(p[now][y][c+d-x]),p[now^1][y][x]=p[now][y][c+d-x];
                    else putchar(p[now][y][x]),p[now^1][y][x]=p[now][y][x];
                }
                puts("");
            }
        }else{
            f(y,1,n){
                f(x,1,m){
                    if(y>=a && y<=b && x>=c && x<=d) putchar(p[now][a+b-y][x]),p[now^1][y][x]=p[now][a+b-y][x];
                    else putchar(p[now][y][x]),p[now^1][y][x]=p[now][y][x];
                }
                puts("");
            }         
        }
        puts("");
        now^=1;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值