棋盘分治

2024-04-09 23:18
文章标签 棋盘 分治

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



#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>  /*
(tr, tc): 棋盘左上角的行号,列号
(dr, dc): 棋盘右上角的行号,列号
size:当前棋盘的大小 = 2 ^k
*/#define EDGE_LEN 8
int board[EDGE_LEN][EDGE_LEN];
int title = 0;void putArray()
{for(int i = 0; i < EDGE_LEN; i++){for(int j = 0; j < EDGE_LEN; j++){printf("%4d", board[i][j]);}printf("\n");}
}void chessBoard(int tr, int tc, int dr, int dc, int size)
{if(size == 1)return;int s = size / 2; //分割棋盘,长宽都变为一半int t =  ++title; //L型骨牌的编号//如果L型骨牌在左上角if(dr < tr + s && dc < tc + s)chessBoard(tr, tc, dr, dc, s);else//否则将其右下角填充(是L型骨牌的一部分,与另外三个不存在特殊方格的形成L型骨牌),构造一个特殊方格{board[tr + s - 1][tc + s - 1] = t;chessBoard(tr, tc, tr + s -1, tc + s - 1, s);}//右上角if(dr < tr + s && dc >= tc + 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(dr >= tr + s && dc >= tc + 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()
{for(int i = 0; i < EDGE_LEN; i++){for(int j = 0; j < EDGE_LEN; j++){board[i][j] = -1;}}board[0][0] = 0;chessBoard(0, 0, 0, 0, EDGE_LEN );putArray();system("pause");return 0;
}


详情,请参考《苏犯法设计与分析》


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



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

相关文章

分治精炼宝库----归并排序应用( ´◔︎ ‸◔︎`)

目录 一.基本概念: 二.归并排序:  三.交易逆序对总数:  四.计算右侧小于当前元素的个数: 五.翻转对:  六.合并k个有序链表: 一.基本概念: 🐻在计算机科学中,分治法是一种很重要的算法。字面上的解释就是“分而治之”,就是把一个复杂的问题分成两个或则更多个相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的

最大子数组问题(第4章:分治策略)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。   思路 1 当我们加上一个正数时,和会

Strassen矩阵乘法简要解析(第4章:分治策略)

Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下: 两个n×n 阶的矩阵A与B的乘积是另一个n×n 阶矩阵C,C可表示为假如每一个C(i, j) 都用此公式计算,则计算C所需要的操作次数为n3 m+n2 (n- 1) a,其中m表示一次乘法,a 表示一次加法或减法。 为了使讨论简便,假设n 是2的幂(也就是说, n是1,2,4,8,1 6,...)。 首先,假设

Matlab 单目相机标定(内置函数,棋盘格)

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 具体的标定原理可以参阅之前的博客Matlab 单目相机标定(内置函数),这里实现对棋盘格数据的标定过程。 二、实现代码 getCameraCorners.m function [camCorners, usedImIdx, imCheckerboard] = getCameraCorners(cali

头歌资源库(14)残缺棋盘

一、 问题描述  二、算法思想   首先,将2^k × 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。 然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左上子棋盘。 接下来,分以下三种情况进行处理: 当k=1时,即棋盘大小为2×2时,直接填充序号即可。 当残缺子棋盘的坐标位于左上子棋盘的右下角时,将左上子棋盘的

[HDU 4334] Trouble (分治+二分查找)

HDU - 4334 给你五个数组,每组 N个元素 (N<=200) 问是否能在五个数组里各选一个数,使得和为0 思路是分治,然后再二分查找,降低复杂度 1) 算出 S1 S_1和 S2 S_2所有元素的和的情况并排序,对 S3 S_3和 S4 S_4亦是如此 O( N2 N^2) 2) 枚举 S3 S_3和 S4 S_4的和数组与 S5 S_5的和的情况 再在 S1 S

[Uva 11990] Dynamic Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化 CDQ分治做法 把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0) (t_0, x_0, y_0) 先统计

算法设计与分析:分治法求最近点对问题

一、实验目的 1. 掌握分治法思想; 2. 学会最近点对问题求解方法。 二、实验内容 1. 对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。 2. 要求随机生成N个点的平面坐标,应用蛮力法编程计算出所有点对的最短距离。 3. 要求随机生成N个点的平面坐标,应用分治法编程计算出所有点对的最短距离。 4. 分别对N=100000~

动态规划以及分治算法的例子

动态规划(Dynamic Programming, DP) 是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 动态规划的核心概念 最优子结构:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构。无后效性:即“未来与过去无关”,只与当前的状态有关。子问题重叠:在求解问

矩阵相乘(分治法)

一个简单的分治算法求矩阵相乘 C=A * B ,假设三个矩阵均为n×n,n为2的幂。可以对其分解为4个n/2×n/2的子矩阵分别递归求解: 递归分治算法: 算法中一个重要的细节就是在分块的时候,采用的是下标的方式。 #include <stdio.h>#include <stdlib.h>#define ROW 16 //指定 行数#define COL 16