求助,为什么最后一个点顺时针或者逆时针三次都是超时.....
查看原帖
求助,为什么最后一个点顺时针或者逆时针三次都是超时.....
145205
Eleven谦楼主2020/6/2 14:51

逆时针+顺时针(逆时针转三次),2.60s,最后一个点超时

逆时针+标准顺时针,2.01s,也是最后一个点超时,代码就是下面给的

吸o2大法让我686ms走过......

想知道怎么优化qwq

#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,r,z,t,a[505][505],b[505][505];

inline void shun(int x,int y,int r) {
	for(register int j=x-r;j<=x+r;j++) {
		for(register int k=y-r;k<=y+r;k++) {
			b[j][k]=a[j][k];
		}
	}
	int xx=x+r,yy=y-r;
	for(register int j=x-r;j<=x+r;j++) {
		for(register int k=y-r;k<=y+r;k++) {
			a[j][k]=b[xx][yy];
			xx--;
		}
		xx=x+r;
		yy++;
	}
}

inline void ni(int x,int y,int r) {
	for(register int j=x-r;j<=x+r;j++) {
		for(register int k=y-r;k<=y+r;k++) {
			b[j][k]=a[j][k];
		}
	}
	int xx=x-r,yy=y+r;
	for(register int j=x-r;j<=x+r;j++) {
		for(register int k=y-r;k<=y+r;k++) {
			a[j][k]=b[xx][yy];
			xx++;
		}
		xx=x-r;
		yy--;
	}
}

int main() {
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;i++) {
		for(register int j=1;j<=n;j++) {
			a[i][j]=++t;
		}
	}
	for(register int i=1;i<=m;i++) {
		memset(b,0,sizeof(b));
		scanf("%d%d%d%d",&x,&y,&r,&z);
		if(z==0) shun(x,y,r);
		if(z==1) ni(x,y,r);
	}
	for(register int i=1;i<=n;i++) {
		for(register int j=1;j<=n;j++) {
			printf("%d ",a[i][j]);
		}
		puts("");
	}
	return 0;
}
2020/6/2 14:51
加载中...