比赛期间写题:好难啊我根本不会啊
比赛之后补题:怎么这么简单?就这(o(╥﹏╥)o)
好吧可能本质还是练题不够,思维和写代码的能力还是没有提升上去
题目来源:AtCoder Regular Contest 153 B
https://atcoder.jp/contests/arc153/tasks/arc153_b
题意:已知一个字符矩阵,给定一个点的坐标,该点坐标左上方、右上方、左下方、右下方的矩阵分别进行180度旋转,然后进行若干次操作(每次操作的给的点的坐标不同)。
![](https://i-blog.csdnimg.cn/blog_migrate/b26f65f395453fafa9e9d1247393e7e2.png)
思路:在场上想到了一半,推出来坐标为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;
}