算法设计——棋盘问题(分治)

问题

在这里插入图片描述

分析

在这里插入图片描述
当棋盘大小为1时,结束
当大小为2时,可找到L骨牌覆盖
当大小大于2时,我们可将棋盘分解为四个相同大小的棋盘的覆盖问题,当某个棋盘不存在特殊方格时,我们则设置特殊方格如(b)
再深入处理小棋盘
我们求解时,首先是设置特殊方格的覆盖,所以设置的特殊方格在某一块棋盘中处于最先覆盖,即数字最小

代码实现

#include<stdio.h>
#include<string.h>
#define N 9
int tile=1,board[N][N]={0};//棋盘从1开始 
//lr、lc左上角的行列号sr、sc特殊方格的行列 size为大小 
void chessboard(int lr,int lc,int sr,int sc,int size){
	if(size==1) return;
	int  t=tile++;
	int s=size/2;
	//处理左上角 
	if(sr<lr+s&&sc<lc+s)//若有特殊方格,继续处理 
		chessboard(lr,lc,sr,sc,s);
	else{//若无则设置右下角为特殊 
		board[lr+s-1][lc+s-1]=t;
		chessboard(lr,lc,lr+s-1,lc+s-1,s);
	}
	//处理右上角 
	if (sr<lr+s&&sc>=lc+s) // 特殊方格在此棋盘中 
		chessboard(lr,lc+s,sr,sc,s); 
	else {// 此棋盘中无特殊方格设置左下角为特殊 
		board[lr+s-1][lc+s]=t;
		chessboard(lr,lc+s,lr+s-1,lc+s,s);
	}
	//处理右下角 
	if(sr>=lr+s&&sc>=lc+s)//若有特殊方格,继续处理 
		chessboard(lr+s,lc+s,sr,sc,s);
	else{//若无则设置左上角为特殊 
		board[lr+s][lc+s]=t;
		chessboard(lr+s,lc+s,lr+s,lc+s,s);
	}
	//处理左下角 
	if (sr>=lr+s&&sc<lc+s) // 特殊方格在此棋盘中 
		chessboard(lr+s,lc,sr,sc,s); 
	else {// 此棋盘中无特殊方格设置右上角角为特殊 
		board[lr+s][lc+s-1]=t;
		chessboard(lr+s,lc,lr+s,lc+s-1,s);
	}
}
int main()
{
	//从下标1开始 
	board[1][3]=-1;//设置特殊方格 
	chessboard(1,1,1,3,8);
	for(int i=1;i<N;i++){
		for(int j=1;j<N;j++){
			printf("%d\t",board[i][j]); 
		}
		printf("\n");
	}
	return 0;
 } 

结果检验

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值