【算法设计与分析】2、棋盘覆盖问题

#include <iostream>

using namespace std;

/*
*这个题的主要思想:
*1、平均吧这个2的k次幂的方格划分为4个部分
*2、一个含有特殊方格的为一部分
*3、剩下3个没有特殊方格的分别贡献一个小方块合成一个“L”
*4、然后把刚刚贡献出去的小方格当成一个特殊方格,重新回到步骤1
*5、如果特殊方格不足4个的时候就是已经全部分完了,跳出去
*/

//我们得知道是k行k列的方格,所以会有k,知道特殊方格的位置行和列 th, tl,划分后的新的方格的起始位置newh,newl,行和列
void qiPan(int k, int th, int tl, int newh, int newl, int a[])
{
	//开始分割棋盘,划分为4个部分
	if(k == 1)	//只有一个特殊方格占据全部
		return;	//用到0个L型的骨牌

	/*
	骨牌可以有4种
-----------------------------------
	**		**		*		 *
	*		 *		**		**
------------------------------------
	*/
	int t=0;	//骨牌的编号
	int s=k/2;	//分割棋盘
//	int a[4] = {0};	//代表四种不同的L型的方格

	//在开始的划分为4个部分的时候,特殊方格可以存在4个大块里的每一块
	//特殊方格在左上部分
	if(th < newh+s && tl < newl+s)
	{
		//这里特殊方格是在左上方的话,就调用4号L骨牌
		a[3]+=1;
		qiPan(s, th, tl, newh, newl, a);	//s:这个是分割棋盘的行数 th:特殊方格的高 tl:特殊方格的列 newh:这个大的方格的起始行 newl:起始列

	}
	else
	{//左上片棋盘中没有特殊方格的话
		//那就把左下角那个方格作为L的一部分用L挡住
		qiPan(s, newh+s-1, newl+s-1, newh, newl, a);
	}
//------------------------------------------------------------------------------------
	//特殊方格在左下部分
	if(th > newh+s-1 && tl < newl+s)
	{
		//这里特殊方格是在左上方的话,就调用2号L骨牌
		a[1]++;
		qiPan(s, th, tl, newh+s, newl, a);	//s:这个是分割棋盘的行数 th:特殊方格的高 tl:特殊方格的列 newh:这个大的方格的起始行 newl:起始列

	}
	else
	{//左上片棋盘中没有特殊方格的话
		//那就把左下角那个方格作为L的一部分用L挡住
		qiPan(s, newh + s, newl + s - 1, newh+s, newl, a);
	}
//------------------------------------------------------------------------------------

	/*
	骨牌可以有4种
	-----------------------------------
	**		**		*		 *
	*		 *		**		**
	------------------------------------
	*/
	//特殊方格在右上部分
	if(th < newh+s && tl > newl+s-1)
	{
		//这里特殊方格是在左上方的话,就调用3号L骨牌
		a[2]++;
		qiPan(s, th, tl, newh, newl+s, a);	//s:这个是分割棋盘的行数 th:特殊方格的高 tl:特殊方格的列 newh:这个大的方格的起始行 newl:起始列

	}
	else
	{//左上片棋盘中没有特殊方格的话
		//那就把左下角那个方格作为L的一部分用L挡住
		qiPan(s, newh + s - 1, newl + s, newh, newl+s, a);
	}
//------------------------------------------------------------------------------------
	//特殊方格在右下部分
	if(th > newh+s-1 && tl > newl+s-1)
	{
		//这里特殊方格是在左上方的话,就调用1号L骨牌
		a[0]++;
		qiPan(s, th, tl, newh+s, newl + s, a);	//s:这个是分割棋盘的行数 th:特殊方格的高 tl:特殊方格的列 newh:这个大的方格的起始行 newl:起始列

	}
	else
	{//左上片棋盘中没有特殊方格的话
		//那就把左下角那个方格作为L的一部分用L挡住
		qiPan(s, newh + s, newl + s, newh+s, newl+s, a);
	}
}

/*
void test(int *b)
{
	for (int i = 0; i <= 3; ++i)
	{
		b[i]++;
		if (i == 2)
		{
			b[i] = 998;
		}
	}
}

*/
int main()
{
	char c;
	int a[4] = { 0 };

	qiPan(4, 1, 2, 1, 1, a);
	//cout << "一共:" << qiPan(4, 1, 2, 1, 1, a) <<"个"<< endl;

	/*
	骨牌可以有4种
	-----------------------------------
	**		**		*		 *
	*		 *		**		**
	------------------------------------
	*/
	char L[4][2][2] =		//使用一个多维数组来表示这几个L型的骨牌
	{
		{ { '*', '*' }, { '*', ' ' } },
		{ { '*', '*' }, { ' ', '*' } },
		{ { '*', ' ' }, { '*', '*' } },
		{ { ' ', '*' }, { '*', '*' } }
	};

	for (int i = 0; i < 4; ++i)
	{
		for (int j = 0; j < 2; ++j)	//第i个骨牌的第一行
		{
			for (int k = 0; k < 2; ++k)	//每行的情况
			{
				cout << L[i][j][k];
			}
			cout << endl;
		}
		cout << "第 " << i +1 << " 个L型的骨牌的使用次数是:" << a[i] << endl;
	}

	/*
	test(a);

	for (int i = 0; i < 4; ++i)
	{
		cout << a[i] << endl;
	}
	*/

	cin >> c;
	return 0;
}

时间: 2024-08-03 11:29:53

【算法设计与分析】2、棋盘覆盖问题的相关文章

计算机算法设计与分析之棋盘覆盖问题

一.引子 最近又重新上了算法课,现在想来有点汗颜,大学期间已经学习了一个学期,到现在却依然感觉只是把老师讲过的题目弄懂了,并没有学到算法的一些好的分析方法和思路,碰到一个新的问题后往往感觉很棘手,痛定思痛之后觉得还是好好再学习一遍,争取能理解透彻每种算法的思路和核心,同时也劝诫各位同行们做事要脚踏实地,不能应付老师的作业,最后吃亏的还是自己啊. 二.棋盘覆盖问题 在一个由2^k *2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘 为一特殊棋盘.现有四种L型骨

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

算法设计与分析 ------最近对问题与8枚硬币问题

利用减治法实现8枚硬币问题: 参考资料:http://blog.csdn.net/wwj_748/article/details/8863503    算法设计--八枚硬币问题 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stdio.h> 4 using namespace std; 5 6 7 void eightcoin(int arr[]); 8 void compare(int a,in

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

【通知】《算法设计与分析》实验课、理论课补课、考试时间、加分等安排 及 个人目标设定

Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多 变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 否患有某种病. 在讲解Logistic回归理论之前,我们先从LR分类器说起.LR分类器,即Logistic Regression Classifier. 在分类情形下,经过学习后的LR分类器是一组权值,当测试样本的数据输入时,这组权值与测试数据按 照线性加和得到 这里是每个样本的个特征. 之后按照s

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<

算法设计与分析(屈婉玲)pdf

下载地址:网盘下载 算法设计与分析本教材为计算机科学技术专业核心课程"算法设计与分析"教材.<算法设计与分析>以算法设计技术和分析方法为主线来组织各知识单元,主要内容包括基础知识.分治策略.动态规划.贪心法.回溯与分支限界.算法分析与问题的计算复杂度.NP完全性.近似算法.随机算法.处理难解问题的策略等.书中突出对问题本身的分析和求解方法的阐述,从问题建模.算法设计与分析.改进措施等方面给出适当的建议,同时也简要介绍了计算复杂性理论的核心内容和处理难解问题的一些新技术. &

算法设计与分析——回溯法算法模板

以深度优先方式系统搜索问题解的算法称为回溯法.在回溯法中,解空间树主要分为了四种子集树.排列树.n叉树和不确定树. 在<算法设计与分析课本>中介绍了11个回溯法的问题样例,这里根据解空间树的类型做一个分类. 子集树 装载问题 符号三角形问题 0-1背包问题 最大团问题 算法模板: void backtrack(int t) { if(搜索到叶子结点) { return; } for(i=0; i<=1; i++) //01二叉树 { if(满足约束函数和限界函数)//剪枝 { backt

算法设计与分析-Week12

题目描述 You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the c

算法设计与分析笔记(一)递归与分治策略

一>递归:直接或间接地调用自身的算法. EG: 1>阶乘定义 n!=n(n-1)! (n>0); pubic static int factorial(int n ){ if(n==0) return 1; else return n*factorial(n-1); } 2>FiBonacci数列 public static int fibo(int n){ if(n<=1)return 1; else fibo(n-1)+fibo(n-2); } 3>排列问题(一个集