@[zzx2022119](/user/872584)
```
#include <bits/stdc++.h>
using namespace std;
int num[510][510] = {0};// 1. 数组较大,最好定义为全局变量
int f[510][510] = {0};
int main()
{
int n = 0, m = 0;
scanf("%d %d", &n, &m);
int i = 0, j = 0, k = 0;
int a = 0, b = 0;
int count = 1;
int x = 0, y = 0, r = 0, z = 0;
// 初始数组
for (i = 0; i < n; i++) {// 2. 涉及到行列,从 1 开始比较好,从 0 开始要注意第 i 行对应到数组中
for (j = 0; j < n; j++) {
num[i][j] = count;
f[i][j] = count;
count++;
}
}
// 操作
for (k = 0; k < m; k++) {
scanf("%d %d %d %d", &x, &y, &r, &z);// 3. 不懂 为什么要先 y 后 x
x -= r;// 4. 范围:[x - 1, x - 1 + 2 * r]
// 所以 为什么要 x -= r ? 如果 从 1 开始遍历,范围直接是 [x - r, x + r]
y -= r;
if (z == 0) {
for (a = x - 1; a < x - 1 + 2 * r; a ++)
for (b = y - 1; b < y - 1 + 2 * r; b ++)
f[b][n - a - 1] = num[a][b];// 5. 原来的式子也不太正确,这是根据你的代码改的
} else {
for (a = x - 1; a < x - 1 + 2 * r; a ++)
for (b = y - 1; b < y - 1 + 2 * r; b ++)
f[n - b - 1][a] = num[a][b];
}
for (a = x - 1; a < x - 1 + r; a++)
for (b = y - 1; b < y - 1 + r; b++)
num[a][b] = f[a][b];// 6. 每施展一次魔法,就要在改动后的数组上继续旋转
// 所以要么每次改动,将改动的结果赋值到 num 数组上
// 要么将要改动的数据先复制到 f 上,直接在 num 上修改 (可参考下述代码)
}
// 打印数组
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%d", num[i][j]);
if (j < n - 1)
{
printf(" ");
}
}
printf("\n");
}
// system("pause");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 510;
int p[maxn][maxn], t[maxn][maxn];
int n, m;
void print() {
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++)
cout << p[i][j] << " ";
cout << "\n";
}
}
void copy(int a, int b, int c, int d) {
for (int i = a; i <= b; i ++)
for (int j = c; j <= d; j ++)
t[i][j] = p[i][j];
}
void tra(int a, int b, int c, int d, int z) {
copy(a, b, c, d);
if(z) {
for (int i = a, v = c; i <= b; i ++, v ++) // 方法不唯一,f[b][n - a - 1] = num[a][b]也可以
for (int j = c, u = b; j <= d; j ++, u --)
p[u][v] = t[i][j];
} else {
for (int i = a, v = d; i <= b; i ++, v --)
for (int j = c, u = a; j <= d; j ++, u ++)
p[u][v] = t[i][j];
}
}
int main()
{
cin >> n >> m;
for (int i = 1, t = 0; i <= n; i ++)
for (int j = 1; j <= n; j ++)
p[i][j] = ++ t;
int x, y, r, z;
while (m --) {
cin >> x >> y >> r >> z;
tra(x - r, x + r, y - r, y + r, z);
}
print();
return 0;
}
```
by Sqj147 @ 2023-07-15 11:01:12
@[zzx2022119](/user/872584)
```
上述5.对应代码仍然不对,因为范围不是[0, n],建议使用我给出的方法,毕竟找规律也是需要时间的。
```
by Sqj147 @ 2023-07-15 11:43:34