7-3 棋盘覆盖 (10 分)(思路加详解)Come baby

一:题目:

在这里插入图片描述

输入格式:
输入三个数,分别是aa,bb,length.

输出格式:
输出整个棋盘。其中特殊方格填为0,然后铺棋盘的顺序为:先铺四个子棋盘交界的部分,然后递归的对每个子棋盘按照左上,右上,右下,左下的顺时针顺序铺满棋盘。每一块骨牌中三个方格数字相同,按照顺序标号,即第一块骨牌全标为1,第二块骨牌全标为2,…,以此类推。输出的每个数占4个场宽,右对齐。

输入样例:

1 1 4

结尾无空行
表示:特殊格子为(1,1),棋盘有4行4列。

输出样例:

  0   2   3   3
   2   2   1   3
   5   1   1   4
   5   5   4   4

表示:先铺三个1(一块L型骨牌),再铺三个2,…,最后铺三个5.

二:思路

这是分治算法的思想,把一个大问题化为小问题,但他特殊点,这个化为小问题之后,就不需要合并了
思路:
1.将棋盘划分为4个子棋盘 在某个棋盘中有特殊方格,而其他3个子棋盘没有特殊方格
2.在其他没有特殊方格的子棋盘的交汇处用L型的特殊方格进行覆盖
3.直到最后的size == 1 为止

三:上码

/*
思路:
1.将棋盘划分为4个子棋盘  在某个棋盘中有特殊方格,而其他3个子棋盘没有特殊方格
2.在其他没有特殊方格的子棋盘的交汇处用L型的特殊方格进行覆盖
3.直到最后的size == 1 为止 

*/ 

#include<bits/stdc++.h>
using namespace std;

int cover[100][100];
int title = 1; 

//tr,tc:表示棋盘左上角的初始位置的行列号 ,dr dc 表示特殊方格的行列号 size = 2^k;  
void board_cover(int tr,int tc,int dr,int dc,int size){
	
	if(size == 1){
		return ;
	} 
	
	int num = title++;
    size = size / 2;//棋盘划分
	
	//1.棋盘的左上角 
	//如果特殊方格在左上角的棋盘中 
	if(dr < tr + size && dc < tc + size)
		board_cover(tr,tc,dr,dc,size);
	else{//如果方格不在左上角的子棋盘中,那么的话在子棋盘的最右下角 覆盖一个方格 
		cover[tr + size - 1][tc + size - 1] = num;
		board_cover(tr,tc,tr + size - 1,tc + size -1,size); //tr + size - 1,tc + size -1 特殊方格的坐标 
	}
	
	//2.棋盘的右上角
	//如果特殊方格在棋盘的子棋盘的右上角 
	if(dr < tr + size && dc >= tc + size)
		board_cover(tr,tc + size,dr,dc,size);
	else{//如果方格不在右上角的子棋盘中,那么的话在子棋盘的最左下角 覆盖一个方格
		
		cover[tr + size - 1][tc + size] = num;
		board_cover(tr,tc + size,tr + size - 1,tc + size,size); 
	}
	
	//3.棋盘的右下角
	if(dr >= tr + size && dc >= tc + size)
		board_cover(tr + size,tc + size,dr,dc,size);
	else{
		cover[tr + size][tc + size] = num;
		board_cover(tr + size,tc + size,tr + size,tc + size,size);
	}
	
	//4.棋盘的左下角
	if(dr >= tr + size && dc < tc + size)
		board_cover(tr + size,tc,dr,dc,size);
	else{
		cover[tr + size][tc + size - 1] = num;
		board_cover(tr + size,tc,tr + size,tc + size -1,size);	
	}
	    	 
} 

int main(){
	
	int dr,dc,length;
	cin >> dr >> dc >> length;
	
	cover[dr][dc] = 0;	
	
	board_cover(1,1,dr,dc,length);
	
	for(int i = 1; i <= length; i++){	
		for(int j = 1; j <= length; j++){
			//cout << ' ' << ' '  << ' ' << cover[i][j];
            //这里的输出格式是为4个字节  不能是前面3个空 
            printf("%4d",cover[i][j]);
		}
		cout << endl;
	}
	
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值