算法之分治法

#include <stdio.h>

#define MAXN 64

int a[MAXN + 1][MAXN + 1] = { 0 };

void gamecal(int k, int n)//处理编号k开始的n个选手的日程

{

int i, j;

if (n == 2)

{

a[k][1] = k; //参赛选手编号

a[k][2] = k + 1; //对阵选手编号

a[k + 1][1] = k + 1; //参赛选手编号

a[k + 1][2] = k; //对阵选手编号

}
else{

gamecal(k, n / 2);

gamecal(k + n / 2, n / 2);

for (i = k; i<k + n / 2; i++) //填充右上角

{

for (j = n / 2 + 1; j <= n; j++)

{

a[i][j] = a[i + n / 2][j - n / 2];

}

}

for (i = k + n / 2; i<k + n; i++) //填充左下角

{

for (j = n / 2 + 1; j <= n; j++)

{

a[i][j] = a[i - n / 2][j - n / 2];

}

}

}

}

int main()

{

int m, i, j;

printf("输入参赛选手人数:");

scanf("%d", &m);

j = 2;

for (i = 2; i<8; i++)

{

j = j * 2;

if (j == m) break;

}

if (i >= 8)

{

printf("参赛选手人数必须为2的整数次幂,且不超过64!\n");

getchar();

return 0;

}

gamecal(1, m);

printf("\n编号 ");

for (i = 2; i <= m; i++)

printf("%2d天 ", i - 1);

printf("\n");

for (i = 1; i <= m; i++)

{

for (j = 1; j <= m; j++)

printf("%4d ", a[i][j]);

printf("\n");

}

getchar();

return 0;

}

时间: 2024-11-26 03:39:50

算法之分治法的相关文章

【算法】分治法细则

分治法的基本步骤:1.分解问题(Divide):把原问题分解为若干个与原问题性质相类似的子问题;2.求解字问题(Conquer):不断分解子问题并求解;3.合并子问题的解(Combine). 分治法的运用条件:1.原问题可以分解为若干与原问题的解:2.子问题可以分解并可以求解:3.子问题的解可以合并为原问题的解:4.分解后的子问题应互相独立,即不包含重叠子问题(如菲不那切竖列). 求解递归函数的方法: 1.代换法1)猜测解的行为:2)数学归纳法证明. 2.递归树法在递归树中,每一个结点都代表递归

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

常用算法之分治法与动态规划法

之所以把这两种算法放到一起,是因为它们都是用来求最优解的问题,与贪心算法是不同的.但是这两种算法又有一些区别,下面来做解释: 分治,即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.     上图用一个例子来解释如下: 当n>1时,想求得T(n),必须知道T(n-1),以此类推,所以要想求得T(n)就必须将T(n)分解,从最小的子问题开始计算,最终求得T(n),这个过程就是一个递归.分治与

算法题|-分治法解决最大子数组问题

分治法就是将一个复杂难解决问题拆成一些容易解决的小问题,再依次解决而最终解决整个问题 new int[] { 2, -3, 4, 67, 6 } 这样一个下标为0到4的数组,要找最大子数组,需要将其拆分成两个子数组,mid=(0+4)/2 即为0~mid的左数组和mid+1~4的右数组 最大子数组可能会出现在以下三个地方 左数组中的某个最大子数组 右数组中的某个最大子数组 以mid为界,向左找到一个最大数组,向右找到一个最大数组,将两个数组合并 第三种情况非常容易得到,通过遍历查找就可以解决,而

数据结构与算法6 - 分治法(上)

分治法: 1. 将问题拆分为几个子问题,并且这些子问题和原问题相似只是量级上小一些. 2. 递归地解决每一个子问题,然后结合这些子问题的解决方案构造出原问题的解决方案. 我们已经遇到过的问题: 1. 二分搜索 2. 归并排序 3. 快速排序 分治法例子: 练习1:快速指数: 能够快速计算出a的n次方 def Fast_pow(a, n): if n == 0: return 1.0 elif n < 0: return 1 / Fast_pow(a, -n) elif n % 2: # 奇数 r

【算法】分治法

思想:分,递归解决若干个较小的问:治,从子问题的答案中形成原始问题的解: 算法举例:快速排序,树的遍历: 快速排序代码:见网址https://www.cnblogs.com/dreamer123/p/9519498.html 原文地址:https://www.cnblogs.com/dreamer123/p/12083061.html

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

在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k>=0 .有 4^k 种不同的特殊棋盘. 下图所看到的的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个. 在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的全部方格,且不论什么 2 个 L 型骨牌不得重叠覆盖. 易知,在不论什么一个 2^k * 2^k 的棋

算法学习~分治法~快速排序

天天都在排序..简直就是要给这个混乱的世界一个正确的秩序..不过嘛.排序也有快慢之分, 冒泡排序法,,思路很简单就是一个个上去打擂台,,这样的时间复杂度很糟糕,,O(N^2)中O是一个常数,O(N^2)是指最大上限(估值)n(n-1)/2 = (n^2 - n)/2最高位估值仍为n^2两种情况是一样的. 选择排序法,,每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完.选择排序是不稳定的排序方时间复杂度为O(n),最坏情况下

算法导论 分治法+归并排序的一种排序算法 C++实现

#include<iostream> #include <time.h> using namespace std; void merge(int*A, int p, int q, int r) { int i = 0; int index1 = 0; int index2 = 0; int length1 = q - p + 1; int length2 = r - q; int* arr1=new int[length1+1]; int* arr2 = new int[lengt