急!(在学校机房)
查看原帖
急!(在学校机房)
1229219
szlyf2011楼主2024/12/17 17:38
#include<bits/stdc++.h>
using namespace std;
const int N = 2000;
struct node{
	long long x,y,pos,upx,upy;
}a[N];
bool cmp(node q,node p){
	if(q.upx != p.upx) return q.upx < p.upx;
	return q.upy < p.upy;
}
long long g[N][N],k,ans[N][N],cnt=0;
void solve(long long px,long long py,long long x,long long y,long long len){
	if(len == 1) return ;
	long long nx = px + len - 1,ny = py + len - 1; // ??? 
	long long midx = (px + nx) / 2,midy = (py + ny) / 2; // ???(??) 
	if(x <= midx && y <= midy){ // ?? 
		//printf("%d %d 1\n",midx+1,midy+1);
		//ans[midx+1][midy+1] = ans[midx][midy+1] = ans[midx+1][midy] = ++cnt;
		a[++cnt].x = midx+1,a[cnt].y = midy+1,a[cnt].pos = 1;
		a[cnt].upx = midx,a[cnt].upy = midy+1;
		solve(px,py,x,y,len/2);
		solve(midx+1,py,midx+1,midy,len/2);
		solve(midx+1,midy+1,midx+1,midy+1,len/2);
		solve(px,midy+1,midx,midy+1,len/2);
	}
	else if(x > midx && y <= midy){ // ?? 
		//printf("%d %d 3\n",midx,midy+1);
		//ans[midx][midy+1] = ans[midx][midy] = ans[midx+1][midy+1] = ++cnt;
		a[++cnt].x = midx,a[cnt].y = midy+1,a[cnt].pos = 3;
		a[cnt].upx = midx,a[cnt].upy = midy;
		solve(midx+1,py,x,y,len/2); 
		solve(midx+1,midy+1,midx+1,midy+1,len/2);
		solve(px,midy+1,midx,midy+1,len/2);
		solve(px,py,midx,midy,len/2);
	}
	else if(x > midx && y > midy){ // ?? 
		//printf("%d %d 4\n",midx,midy);
		//ans[midx][midy] = ans[midx][midy+1] = ans[midx+1][midy] = ++cnt;
		a[++cnt].x = midx,a[cnt].y = midy,a[cnt].pos = 4;
		a[cnt].upx = midx,a[cnt].upy = midy;
		solve(px,py,midx,midy,len/2);
		solve(px,midy+1,midx,midy+1,len/2);
		solve(midx+1,midy+1,x,y,len/2);
		solve(midx+1,py,midx+1,midy,len/2);
	}
	else if(x <= midx && y > midy){ //?? 
		//printf("%d %d 2\n",midx+1,midy);
		//ans[midx+1][midy] = ans[midx][midy] = ans[midx+1][midy+1] = ++cnt;
		a[++cnt].x = midx+1,a[cnt].y = midy,a[cnt].pos = 2;
		a[cnt].upx = midx,a[cnt].upy = midy;
		solve(px,py,midx,midy,len/2); //left up
		solve(px,midy+1,x,y,len/2); // right up
		solve(midx+1,py,midx+1,midy,len/2);
		solve(midx+1,midy+1,midx+1,midy+1,len/2);
	}
}
int main(){
	long long x,y;
	cin >> k >> x >> y;
	long long len = 1 << k;
	solve(1,1,x,y,len);
	sort(a+1,a+1+cnt,cmp);
	int s = 0;
	for(long long i = 1;i <= cnt;i++){
		if(a[i].pos == 1)
			ans[a[i].x][a[i].y] = ans[a[i].x-1][a[i].y] = ans[a[i].x][a[i].y-1] = ++s;
		else if(a[i].pos == 2)
			ans[a[i].x][a[i].y] = ans[a[i].x-1][a[i].y] = ans[a[i].x][a[i].y+1] = ++s;
		else if(a[i].pos == 3)
			ans[a[i].x][a[i].y] = ans[a[i].x][a[i].y-1] = ans[a[i].x+1][a[i].y] = ++s;
		else if(a[i].pos == 4)
			ans[a[i].x][a[i].y] = ans[a[i].x+1][a[i].y] = ans[a[i].x][a[i].y+1] = ++s;
	}
	for(long long i = 1;i <= len;i++){
		for(long long j = 1;j <= len;j++)
			cout << ans[i][j] << " ";
		cout << endl;
	}
	return 0;
}
2024/12/17 17:38
加载中...