求帮求教!!!!

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

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