分治法,棋盘覆盖

2024-09-01 17:58
文章标签 覆盖 棋盘 分治

本文主要是介绍分治法,棋盘覆盖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//分治法--棋盘覆盖问题  
//问题描述:在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,
//且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用4不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,
//且任何2个L型骨牌不得重叠覆盖。
//思想:将2^k x 2^k的棋盘,先分成相等的四块子棋盘,其中特殊方格位于四个中的一个,构造剩下没特殊方格三个子棋盘,
//将他们中的也假一个方格设为特殊方格。如果是:
//左上的子棋盘(若不存在特殊方格)----则将该子棋盘右下角的那个方格假设为特殊方格
//右上的子棋盘(若不存在特殊方格)----则将该子棋盘左下角的那个方格假设为特殊方格
//左下的子棋盘(若不存在特殊方格)----则将该子棋盘右上角的那个方格假设为特殊方格
//右下的子棋盘(若不存在特殊方格)----则将该子棋盘左上角的那个方格假设为特殊方格
//当然上面四种,只可能且必定只有三个成立,那三个假设的特殊方格刚好构成一个L型骨架,我们可以给它们作上相同的标记。
//这样四个子棋盘就分别都和原来的大棋盘类似,我们就可以用递归算法解决。
//算法说明:用一个二维整形数组board表示棋盘,board【0】【0】是棋盘左上角方格,
//tile是算法中的一个全局整型变量,用来表示骨牌编号,初始值为0
//参数:tr是棋盘左上角的方格行号
//      tc是棋盘左上角的方格列号
//      dr是特殊方格所在行号
//      dc是特殊放个所在列号
//      size是2^k,棋盘是 2^k*2^k的
//      此程序可以实现检测是否可以覆盖
//      因为骨牌个数是4^k/3,只需检测是否是整数 
//本题即使要求,将图形分割,变为4个格子的大小,然后4个格子中有一个被覆盖,另外3个格子被新的一个覆盖 
#include<iostream>
#include<iomanip>
using namespace std;
int board[8][8]={0};
int tile=1;                                            //tile骨牌编号 
void chessboard(int tr,int tc,int dr,int dc,int size)//左上行号,左上列号,特殊行号,特殊列号,棋盘大小 
{
if(size==1)return;
int t=tile++;       //编号加1 
int s=size/2;     // 规模缩小 
//左上角 
if(dr<tr+s&&dc<tc+s)//特殊行小于左上行+规模...确定特殊格子在左上位置 
chessboard(tr,tc,dr,dc,s);      //继续分割,找到位置 
else
{
board[tr+s-1][tc+s-1]=t;                       //若不在左上区间,在左上区域最下边角落  覆盖 
chessboard(tr,tc,tr+s-1,tc+s-1,s);                //继续调用 
}
//分别对左上,左下,右上,右下位置寻找或覆盖,直至k==1停止 
//右上角 
if(dc>=tc+s&&dr<tr+s)
chessboard(tr,tc+s,dr,dc,s);
else
{
board[tr+s-1][tc+s]=t;
chessboard(tr,tc+s,tr+s-1,tc+s,s);
}
//左下角 
if(dr>=tr+s&&dc<tc+s)
chessboard(tr+s,tc,dr,dc,s);
else
{
board[tr+s][tc+s-1]=t;
chessboard(tr+s,tc,tr+s,tc+s-1,s);
}
//右上角 
if(dc>=tc+s&&dr>=tr+s)
chessboard(tr+s,tc+s,dr,dc,s);
else
{
board[tr+s][tc+s]=t;
chessboard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main()
{
chessboard(0,0,0,7,8);                      //特殊格子位置,在[0,7],图形规模为2的3次方 
for(int i=0 ; i<8 ; i++)
for(int j=0 ; j<8 ; j++)
{
cout  << setw(3) << board[i][j];
if(j==7)
cout << endl ;
}         
return 0;      
}
//输出即为格子覆盖状况,同一标号为同一图形 
//fout<<setw(x)<<n(x>0)相对于右对齐x位
//cout<<setw(x)<<n(x<0)相对于左对齐-x位 

这篇关于分治法,棋盘覆盖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127650

相关文章

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

Minimal coverage -uva 覆盖线段,贪心

一道经典的贪心问题,具体方法就是将(an,bn)区间,按照an从小到大的顺序进行排序,之后从0开始, 取最大的有效区间,这里用到了结构体的快排,否则可能会超时. #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 100000 + 10#define BOTTOM -50000 - 10str

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

过滤器:覆盖过滤器如何在凝结水处理系统中应用

本文介绍了覆盖过滤器的基本原理,阐述了覆盖过滤器处理凝结水中悬浮物和胶体的工艺流程及铺膜、过滤、爆膜等环节的操作规范。指出覆盖过滤器在运行中存在铺不上膜、铺膜不匀、脱膜等常见的故障并提出处理方法。   0·引言   凝结水处理系统设置覆盖过滤器的目的是除去凝结水中的金属腐蚀物及油类等杂质。这些杂质通常为悬浮颗粒和胶体,如果不被滤除,会污染离子交换树脂,反冲洗过滤器原理使其交换量下降,工作周

AcWing907. 区间覆盖

参考的视频讲解:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【贪心算法08-区间问题03-区间覆盖】 每次贪心就是选择左端点里面<起始端点里面右边界最大的,这样就是保证了最少区间个数! 然后每次迭代都会更新一次起始端点st,反复运用本算法。 一定要仔细看视频讲解!!! #include<iostream>#include<algorithm>#define N 100010#define INF 2

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu

分治算法与凸包问题

1. 什么是凸包问题? 凸包问题是计算几何中的经典问题。给定二维平面上的点集,凸包是一个最小的凸多边形,它包含了点集中所有的点。你可以把凸包想象成一根松紧带将所有点紧紧包裹住的样子,凸包的边缘仅沿着最外面的点延伸。 2. 分治法简介 分治算法是解决复杂问题的强大策略,它的思想是将问题分解为多个子问题,分别解决这些子问题后再合并得到最终解。凸包问题可以通过分治算法高效地解决,时间复杂度可以达到