- [1007] 魔法少女小Scarlet
求帮求教
- 2025-1-27 2:16:33 @
求帮求教!!!!
I NEED HELP, PLEASE TEACH ME!!!!
样例输入:
5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 1
样例输出:
5 10 3 18 15
4 19 8 17 20
1 14 23 24 25
6 9 2 7 22
11 12 13 16 21
我的输出:
5 10 11 4 5
4 19 14 19 10
11 14 13 18 15
16 9 12 17 22
21 22 23 16 21
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e2 + 10;
int n, m, x, y, r, z, num;
int a[N][N], b[N][N];
bool v[N][N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = ++num;
while (m--)
{
memset(v, false, sizeof(v));
cin >> x >> y >> r >> z;
for (int i = x - r; i <= x + r; i++)
for (int j = y - r; j <= y + r; j++)
v[i][j] = true;
if (!z) // 顺时针
{
for (int i = 1; i <= n; i++)
for (int j = n, bj = 1; j >= 1 and bj <= n; j--, bj++)
b[i][bj] = a[j][i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (v[i][j])
a[i][j] = b[i][j];
}
else // 逆时针 = 顺时针3次
{
for (int i = 1; i <= n; i++)
for (int j = n, bj = 1; j >= 1 and bj <= n; j--, bj++)
b[i][bj] = a[j][i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (v[i][j])
a[i][j] = b[i][j];
for (int i = 1; i <= n; i++)
for (int j = n, bj = 1; j >= 1 and bj <= n; j--, bj++)
b[i][bj] = a[j][i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (v[i][j])
a[i][j] = b[i][j];
for (int i = 1; i <= n; i++)
for (int j = n, bj = 1; j >= 1 and bj <= n; j--, bj++)
b[i][bj] = a[j][i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (v[i][j])
a[i][j] = b[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
2 comments
-
h_h LV 5 MOD @ 2025-1-27 10:22:37
核心逻辑:1你这个逆时针=顺时针转3次很有趣,但是你如果这么写就得把“顺时针转”这个函数抽取出来进行代码复用,不要这样复制粘贴。 2:关注顺时针,对于第一个要求,关注坐标变化。很明显的规律
1 2 3 6 7 8 11 12 13
转成
11 6 1 12 7 2 13 8 3
3写循环旋转确实坑太多,不要swap,建议弄个中转数组暂存调试
-
2025-1-27 10:14:00@
首先,抽取你的输出语句作为调试代码段,输入确认+每步中间结果都要输出
void print(){ for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cout << a[i][j] << " "; cout << endl; } cout << endl; }
你打出来是这样式的(第一部分输出是确认输入处理结果的,你的问题,此处作为调试演示。后面每块是每次旋转结果)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 21 16 11 4 5 22 17 12 9 10 23 18 13 14 15 16 17 18 19 20 21 22 23 24 25 21 16 11 4 5 22 9 14 19 10 23 12 13 18 15 16 17 18 17 20 21 22 23 24 25 21 16 11 4 5 22 9 14 19 10 23 12 13 14 11 16 17 18 19 4 21 22 15 10 5 5 10 11 4 5 4 19 14 19 10 11 14 13 18 15 16 9 12 17 22 21 22 23 16 21
正确的是这样式的
11 6 1 4 5 12 7 2 9 10 13 8 3 14 15 16 17 18 19 20 21 22 23 24 25 11 6 1 4 5 12 9 14 19 10 13 2 3 18 15 16 7 8 17 20 21 22 23 24 25 11 6 1 4 5 12 9 14 19 10 13 2 23 8 3 16 7 24 17 18 21 22 25 20 15 5 10 3 18 15 4 19 8 17 20 1 14 23 24 25 6 9 2 7 22 11 12 13 16 21 5 10 3 18 15 4 19 8 17 20 1 14 23 24 25 6 9 2 7 22 11 12 13 16 21
- 1
Information
- ID
- 981
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 35
- Accepted
- 15
- Uploaded By