码迷,mamicode.com
首页 > Web开发 > 详细

<html>

时间:2017-08-13 13:27:00      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:hid   signal函数   dal   mcs   list   encode   warning   ase   submit   

#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;
}

版权声明:本文为博主原创文章。未经博主同意不得转载。 举报
  • 本文已收录于下面专栏:

相关文章推荐

js算法:分治法-棋盘覆盖

附代码: New Document table,td{ border:1px solid gray; } ...

棋盘覆盖(nyoj 45)

题目链接:

棋盘覆盖问题

#include #include #include using namespace std; /* *棋盘覆盖问题 */ static int t=0; void ChessBoard(int ...

谈一谈棋盘覆盖问题

棋盘覆盖问题,是一类用分治法来求解的数学问题。

这个问题的一般描写叙述是这种: 如上图所看到的,(这个图是我网上copy来的),这是一个4*4规模的棋盘。

对于这类问题来讲。棋盘的规模一般都是 2...

分治法——棋盘覆盖问题

分治法——棋盘覆盖问题 棋盘覆盖问题。有一个2k?2k2^k*2^k的方格棋盘。恰有一个方格是黑色的,其它为白色。你的任务是用包括3个方格的L型牌覆盖全部白色方格。黑色方格不能被覆盖。且随意一个白...

棋盘覆盖 算法分析、设计与实现(Java)

该篇尽管与非常多的博客、讲解一样讲的都是棋盘覆盖的解法。

可是,该篇很多其它地倾向于“证明”,这也是我与非常多读者都想知道的,而不是开篇就上代码。 ? ? 文件夹 0,问题描写叙述... 1 1。相关博客... 1 ...

利用分治法解决棋盘覆盖问题

1.问题描写叙述:点击打开链接 2.代码: #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #in...

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

在一个由2^k *2^k个方格组成的棋盘中。恰有一个方格与其它方格不同。称该方格为一特殊方格。且称该棋盘 为一特殊棋盘。现有四种L型骨牌例如以下图所看到的。要用这四种骨牌覆盖棋盘上除特殊方格之外的其它全部格子...
  • 技术分享
  • hqh45
  • 2014-10-24 22:16
  • 1058

分治算法具体解释

转:http://blog.csdn.net/effective_coder/article/details/8697789 <span style="font-size: 16

计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题

计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题 1. 2.L型骨牌的棋盘覆盖问题: 代码实现: #include #include #include ...
  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多仅仅同意输入30个字)

技术分享

<html>

标签:hid   signal函数   dal   mcs   list   encode   warning   ase   submit   

原文地址:http://www.cnblogs.com/ljbguanli/p/7352947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!