残缺棋盘

//残缺棋盘的问题要求用3个方格的板(三格板)(triominoes)覆盖残缺棋盘。

//在此覆盖中,两个三格板不能重叠,三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。

//在这种限制条件下,所需要的三格板总数为(2^(2k-1))/3。

//可以验证(2^(2k-1))/3是一个整数。k为0的残缺棋盘很容易被覆盖,

//因为它没有非残缺的方格,用于覆盖的三格板的数目为0。当k=1时,

//正好存在3个非残缺的方格,并且这三个方格某一方 向的三格板来覆盖。

//小残缺棋盘

//  1

//1 1

//2

//2 2

//3 3

//  3

//4 4

//4

int amount = 0;
int array[16][16] = { 0 };
void Print(int size)
{
	for (int i = 0; i < size; ++i)
	{
		for (int j = 0; j < size; ++j)
			printf("%-3d ", array[i][j]);
		cout << endl;
	}
	cout << endl;
}
void tileBoard(int tr,int tc,int dr,int dc,int size)
{
	int s, t;
	if(size <2)
		return;
	amount = amount + 1;
	t = amount;
	s = size / 2;
	if (dr < tr + s&&dc < tc + s)
	{
		tileBoard(tr, tc, dr, dc, s);
		array[tr + s - 1][tc + s] = t;
		array[tr + s][tc + s - 1] = t;
		array[tr + s][tc + s] = t;
		tileBoard(tr, tc+s, dr+s-1, dc+s, s);
		tileBoard(tr+s, tc, dr+s, dc+s-1, s);
		tileBoard(tr+s, tc+s, dr+s, dc+s, s);

	}
	else if (dr < tr + s&&dc >= tc + s)
	{
		tileBoard(tr, tc+s, dr, dc, s);
		array[tr + s - 1][tc + s-1] = t;
		array[tr + s][tc + s - 1] = t;
		array[tr + s][tc + s] = t;
		tileBoard(tr, tc , dr + s - 1, dc + s-1, s);
		tileBoard(tr + s, tc, dr + s, dc + s - 1, s);
		tileBoard(tr + s, tc + s, dr + s, dc + s, s);
	}
	else if (dr >=tr + s&&dc < tc + s)
	{
		tileBoard(tr+s, tc, dr, dc, s);
		array[tr + s - 1][tc + s-1] = t;
		array[tr + s -1][tc + s] = t;
		array[tr + s][tc + s] = t;
		tileBoard(tr, tc , dr + s - 1, dc + s-1, s);
		tileBoard(tr, tc+s, dr + s-1, dc + s , s);
		tileBoard(tr + s, tc + s, dr + s, dc + s, s);

	}
	else if (dr >=tr + s&&dc >= tc + s)
	{
		tileBoard(tr+s, tc+s, dr, dc, s);
		array[tr + s - 1][tc + s-1] = t;
		array[tr + s-1][tc + s] = t;
		array[tr + s][tc + s-1] = t;
		tileBoard(tr, tc, dr + s - 1, dc + s-1, s);
		tileBoard(tr + s, tc+s, dr + s-1, dc + s , s);
		tileBoard(tr + s, tc + s, dr + s, dc + s-1, s);

	}
}
void Test1()
{
	/*int a = 1;
	char b = 2;
	short c = 4;*/

	tileBoard(0, 0,0,0,8);
	Print(8);
}

运行结果:

时间: 2024-10-27 07:30:44

残缺棋盘的相关文章

残缺棋盘的覆盖问题

棋盘覆盖问题    问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目输入k

《程序员的数学思维修炼》 读书笔记

电子书定价:     ¥ 45.00       这是什么?                     纸书定价:     ¥ 45.00       Kindle电子书价格:     ¥ 1.99                   为您节省:     ¥ 43.01      (0.4折)            ~ 周颖   等 (作者) 发售日期: 2014年4月1日 本书是一本专门为程序员而写的数学书,介绍了程序设计中常用的数学知识.本书门槛不高,不需要读者精通很多高深的数学知识,只需要读

《PHP程序员面试笔试宝典》——如何回答算法设计问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中的很多算法设计问题,都是历年来各家企业的"炒现饭",不管求职者以前对算法知识掌握得是否扎实,理解得是否深入,只要面试前买本<程序员面试笔试宝典>,应付此类题目完全没有问题.但遗憾的是,很多世界级知名企业也深知这一点,如果纯粹是出一些毫无技术含量的题目,对于考前"突击手"而言,可能会占尽便宜,但对于那些技术好的人而言是非常不公平的.所以,为了把优秀的求职者与一般的求

考试整理

残缺棋盘问题 这个需要采取分治的思想 就是使劲的将棋盘分为等价的四份 知道找到一个残块,然后递归放置直到整张棋盘 Code: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<iomanip> #include<string> #include<algorithm> #include<cstdlib> #

csuoj 1511: 残缺的棋盘

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 1511: 残缺的棋盘 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. 输出 对于每组数据,输出测试点编号和最少步数. 样例输入 1 1 8 7 5 6 1 1 3 3

湖南省第十届大学生计算机程序设计竞赛:残缺的棋盘

1511: 残缺的棋盘 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 169 Solved: 56 [Submit][Status][Web Board]Description] Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数.

CSU 1511 残缺的棋盘

1511: 残缺的棋盘 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 169  Solved: 56 [Submit][Status][Web Board] Description Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数

CSU 1511: 残缺的棋盘(BFS啊 )

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 Description Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数. Sample Input 1 1 8 7 5 6 1 1 3 3 2 2 Sample

CSU 1511 残缺的棋盘 第十届湖南省赛题

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 题目大意:在一个8*8的棋盘中,给你一个起点位置和一个终点位置,同时也给你一个陷阱位置,问你从起点绕过陷阱到终点的最短距离.(可以上下左右走还可以斜走) 解题思路:可以直接用搜索,也可以用数学知识来解决,我们之前学过,两点之间直接最短,所以当陷阱不在这条直线上的时候,我们就不用考虑陷阱了,直接是max(abs(x1-y1),abs(x2-y2))最终结果, 但是如果陷阱在两条直线