【递归与分治】棋盘覆盖

U91193 棋盘覆盖

▲ 有个重要的思想:为了达成分治的目的,要在没有真正特殊点的子棋盘内假设一个特殊点,以此出发才能继续分治

▲ 此外,注意到在不同层函数(即不同大小的棋盘)之间,L型块编号应是递增的,但在同一层函数中,L型块的编号不变(执行完一层函数,才是完全地填完了同一个L型块)。要达到这样的效果,只需让n在函数递归的过程中递增,而函数内部 int t=n,确保同一层函数中同一个L型块的各个格子编号都相同

在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int map[1000][1000];
int k,x,y,n=0;
int g;
void chess(int kx,int ky,int sx,int sy,int size){
	if(size==1) return;
	n++;
	int t=n;
	/*for(int i=1;i<=g;i++){
		for(int j=1;j<=g;j++){
			printf("%-3d ",map[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	*/
	int s=size/2;
	//左上角棋盘 
	if(sx<kx+s&&sy<ky+s) chess(kx,ky,sx,sy,s);
	else{
		//覆盖右下角格子,并令其为特殊点 
		map[kx+s-1][ky+s-1]=t;
		chess(kx,ky,kx+s-1,ky+s-1,s);
	}
	//右上角棋盘
	if(sx<kx+s&&sy>=ky+s) chess(kx,ky+s,sx,sy,s);
	else{
		 //覆盖左下角格子,并令其为特殊点 
		 map[kx+s-1][ky+s]=t;
		 chess(kx,ky+s,kx+s-1,ky+s,s);
	}
	//左下角棋盘
	if(sy<ky+s&&sx>=kx+s) chess(kx+s,ky,sx,sy,s);
	else{
		map[kx+s][ky+s-1]=t;
		chess(kx+s,ky,kx+s,ky+s-1,s);
	}
	//右下角棋盘
	if(sx>=kx+s&&sy>=ky+s) chess(kx+s,ky+s,sx,sy,s);
	else{
		map[kx+s][ky+s]=t;
		chess(kx+s,ky+s,kx+s,ky+s,s);
	}
}
int main(){
	cin>>k>>x>>y;
	g=pow(2,k);
	chess(1,1,x,y,g);
	for(int i=1;i<=g;i++){
		for(int j=1;j<=g;j++){
			printf("%d ",map[i][j]);
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值