求求,x,y没搞反但是只有第十个过了

P4924 [1007] 魔法少女小Scarlet

@[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


|