残缺棋盘(分治策略--递归)

2023-10-30 22:50

本文主要是介绍残缺棋盘(分治策略--递归),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

残缺棋盘(分治策略)

残缺棋盘是指有2^k x 2^k个方格的棋盘中恰好有一个方格是坏的。

在残缺棋盘问题中,我们要用三方块把棋盘填满。要求在铺的过程中三方块不能重叠,不能盖住残缺的方块,并且要铺满其他所有方块。

样例:

可以采用分治策略的方式(类似于常见的递归的方式),将棋盘划分成四部分。一部分含有残缺块,其他三部分完整。将完整的三部分的位于整个棋盘中间部分的三个方格填充,并将其当作新的残缺块。然后,对四个部分重复上述操做,递归求解。
 

//1.按左上角优先递归
//2.将填充的棋盘块当成新的残缺块进行处理
#include <iostream>
#include<cstdio>
using namespace std;
int board[10000][10000];
int tile=1;
void TileBoard(int topRow,int topColumn,int defectRow,int defectColumn,int Size);
int main()
{
int topRow=0,topColumn=0,defectRow,defectColumn,Size;
//棋盘左上角坐标(topRow,topColumn),残缺块的坐标(defectRow,defectColumn),边长Size
cin>>defectRow>>defectColumn>>Size;
TileBoard(topRow,topColumn,defectRow,defectColumn,Size);
for(int i=0;i<Size;i++){
for(int j=0;j<Size;j++)
printf("%-3d",board[i][j]);
cout<<endl;
}
return 0;
}void TileBoard(int topRow,int topColumn,int defectRow,int defectColumn,int Size){
if(Size==1) return;
int tileToUse=tile++;
int quadrantSize=Size/2;
//残缺块左上角1/4部分 if(defectRow<topRow+quadrantSize&&defectColumn<topColumn+quadrantSize){
TileBoard(topRow,topColumn,defectRow,defectColumn,quadrantSize);
}
else{
board[topRow+quadrantSize-1][topColumn+quadrantSize-1]=tileToUse;
TileBoard(topRow,topColumn,topRow+quadrantSize-1,topColumn+quadrantSize-1,quadrantSize);
}//残缺块右上角1/4部分
if(defectRow<topRow+quadrantSize&&defectColumn>topColumn+quadrantSize-1){
TileBoard(topRow,topColumn+quadrantSize,defectRow,defectColumn,quadrantSize);
}
else{
board[topRow+quadrantSize-1][topColumn+quadrantSize]=tileToUse;
TileBoard(topRow,topColumn+quadrantSize,topRow+quadrantSize-1,topColumn+quadrantSize,quadrantSize);
}//残缺块左下角1/4部分
if(defectRow>topRow+quadrantSize-1&&defectColumn<topColumn+quadrantSize){
TileBoard(topRow+quadrantSize,topColumn,defectRow,defectColumn,quadrantSize);
}
else{
board[topRow+quadrantSize][topColumn+quadrantSize-1]=tileToUse;
TileBoard(topRow+quadrantSize,topColumn,topRow+quadrantSize,topColumn+quadrantSize-1,quadrantSize);
}//残缺块右下角1/4部分
if(defectRow>topRow+quadrantSize-1&&defectColumn>topColumn+quadrantSize-1){
TileBoard(topRow+quadrantSize,topColumn+quadrantSize,defectRow,defectColumn,quadrantSize);
}
else{
board[topRow+quadrantSize][topColumn+quadrantSize]=tileToUse;
TileBoard(topRow+quadrantSize,topColumn+quadrantSize,topRow+quadrantSize,topColumn+quadrantSize,quadrantSize);
}
}

这篇关于残缺棋盘(分治策略--递归)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

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

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

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止