棋盘覆盖问题-分治思想(基础版)--C

问题描述:在一个2k×2k (k≥0)个方格组成的棋盘中,有一个方格与其他不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4k种情形,因而对任何K>=0来说有4k种不同的棋盘。棋盘覆盖问题(chess cover problem)要求用4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
在这里插入图片描述
代码如下:

#include<stdio.h>
#include<stdlib.h>
#define N 8
int Board[N][N];//定义一个棋盘
int tile = 1;	//表示骨牌的型号
void ChessBoard(int r, int c, int fr, int fc, int size);
//r表示棋盘左上角行号,c表示棋盘左上角列号,fr表示特殊方格所在行号,fc表示特殊方格所在列号,size棋盘规格
int main()
{
	//将棋盘各方格初始化为0
	for (int i = 0; i < N; i++)
		for (int j = 0; j < N; j++)
			Board[i][j] = 0;
	
	ChessBoard(0, 0, 2, 3, N);

	//输出棋盘
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
			printf("%d\t", Board[i][j]);
			printf("\n");
	}
	system("PAUSE");	//因编译器原因,防止运行结果闪退
}

void ChessBoard(int r, int c, int fr, int fc, int size)
{
	if (size == 1)
		return;
	int t = tile++;		//本列用相同数字表示骨牌
	int s = size / 2;

	if (fr < r + s && fc < c + s)						//特殊方格在此小棋盘内
		ChessBoard(r, c, fr, fc, s);
	else												//特殊方格不在此棋盘
	{
		Board[r + s - 1][c + s - 1] = t;				//用t号骨牌覆盖右下角
		ChessBoard(r, c, r + s - 1, c + s - 1, s);		//继续覆盖其余方格
	}
	//后面三个if-else类似于第一个
	if (fr >= r + s && fc < c + s)
		ChessBoard(r+s, c, fr, fc, s);
	else
	{
		Board[r + s][c + s - 1] = t;
		ChessBoard(r+s, c, r + s, c + s - 1,s);
	}

	if (fr<r + s && fc>=c + s)
		ChessBoard(r, c+s, fr, fc, s);
	else
	{
		Board[r + s - 1][c + s] = t;
		ChessBoard(r, c+s, r + s - 1, c + s,s);
	}

	if (fr >= r + s && fc >= c + s)
		ChessBoard(r+s, c+s, fr, fc, s);
	else
	{
		Board[r + s][c + s] = t;
		ChessBoard(r+s, c+s, r + s, c + s,s);
	}

}

本文提供的为基础解法,参照教材计算机算法设计与分析第五版-王晓东

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值