求救!最后4个点TLE!求大佬帮忙优化。代码有注释
查看原帖
求救!最后4个点TLE!求大佬帮忙优化。代码有注释
607157
lzlzl楼主2023/8/8 23:38

我的思路是:

12345
678910
1112131415
1617181920
2122232425
每一次旋转都可以看作是几个圈的旋转

比如说3 3 2 0可以看作是

  1. 7 8 9 14 19 18 17 12 7这个圈的旋转
  2. 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6这个圈的旋转
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[500][500],a1[500][500];
//a1是备用数组
int x,y,r,z;
int main()
{
	cin>>n>>m;
	int cnt=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a1[i][j]=a[i][j]=++cnt;
  	//输入数组
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>r>>z;
		if(z==0)//顺时针
		{
			for(int j=1;j<=r;j++)//对于每一圈进行枚举
			{
				int x1=x-j,y1=y-j;
				int x2=x+j,y2=y+j;
           //每一圈边界
				int c=2*j+1;
				for(int k=x1;k<=x2;k++)
					for(int l=y1;l<=y2;l++)
					if(k==x1||l==y1||k==x2||l==y2)
					{
						int r1=j,k1,l1;
						if(k==x1){l1=l+c-1;k1=x1+(l1-y2);l1=y2;}
						else if(l==y2){k1=k+(c-1);l1=y2-(k1-x2);k1=x2;}
						else if(k==x2){l1=l-(c-1);k1=x2-(y1-l1);l1=y1;}
						else if(l==y1){k1=k-(c-1);l1=y1+(x1-k1);k1=x1;}
						a1[k1][l1]=a[k][l];//进行旋转
					}	
			}
		}
		if(z==1)//逆时针,下面注释同顺时针
		{
			for(int j=1;j<=r;j++)
			{
				int x1=x-j,y1=y-j;
				int x2=x+j,y2=y+j;
				int c=2*j+1;
				for(int k=x1;k<=x2;k++)
					for(int l=y1;l<=y2;l++)
					if(k==x1||l==y1||k==x2||l==y2)
					{
						int r1=j,k1,l1;
						if(k==x1){l1=l-(c-1);k1=x1+(y1-l1);l1=y1;}
						else if(l==y1){k1=k+(c-1);l1=y1+(k1-x2);k1=x2;}
						else if(k==x2){l1=l+(c-1);k1=x2-(l1-y2);l1=y2;}
						else if(l==y2){k1=k-(c-1);l1=y2-(x1-k1);k1=x1;}
						a1[k1][l1]=a[k][l];
					}
			}
		}
		int x1=x-r,x2=x+r;
		int y1=y-r,y2=y+r;
		for(int k=x1;k<=x2;k++)
			for(int l=y1;l<=y2;l++)
				a[k][l]=a1[k][l];
     //用备用数组覆盖原数组
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}//输出
	return 0;
}
2023/8/8 23:38
加载中...