文章目录

  • 1、棋盘覆盖问题
  • 2、合并排序问题
  • 3、集合最大元问题
  • 4、循环赛日程表

一、实验目的:
掌握分治算法的基本思想,掌握分治算法的设计步骤及用递归技术实现分治策略。

二、实验所用仪器及环境
Windows 7 以上操作系统,PC机,codeblocks环境

三、 实验原理:
算法总体思想:对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之,如下图所示。

四、 实验内容:

1、棋盘覆盖问题

在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
int chess[maxn][maxn]={0};
int gupaihao=1;///公共变量骨牌号
void chesser(int zuoshangY,int zuoshangX,int teshuY,int teshuX,int n)///n是实际大小,
{if(n==1)//bianjie{return ;}int t=gupaihao++;int dangqiankuaidaxiao=n/2;///2K,不怕出0.5//左上if(zuoshangY+dangqiankuaidaxiao>teshuY&&zuoshangX+dangqiankuaidaxiao>teshuX)///有特殊方格{///接着分chesser(zuoshangY,zuoshangX,teshuY,teshuX,dangqiankuaidaxiao);}else{//yao else///meiyou,左上角棋盘要盖右下角chess[zuoshangY+dangqiankuaidaxiao-1][zuoshangX+dangqiankuaidaxiao-1]=t;///剩下的这不就有了吗chesser(zuoshangY,zuoshangX,zuoshangY+dangqiankuaidaxiao-1,zuoshangX+dangqiankuaidaxiao-1,dangqiankuaidaxiao);///右下角成为新的特殊点}///然后是剩下三个,一样思路//右上if(zuoshangY+dangqiankuaidaxiao>teshuY&&zuoshangX+dangqiankuaidaxiao<=teshuX){chesser(zuoshangY,zuoshangX+dangqiankuaidaxiao,teshuY,teshuX,dangqiankuaidaxiao);}else{///把左下角改喽chess[zuoshangY+dangqiankuaidaxiao-1][zuoshangX+dangqiankuaidaxiao]=t;chesser(zuoshangY,zuoshangX+dangqiankuaidaxiao,zuoshangY+dangqiankuaidaxiao-1,zuoshangX+dangqiankuaidaxiao-1,dangqiankuaidaxiao);}//zuoxiaif(zuoshangY+dangqiankuaidaxiao<=teshuY&&teshuX<zuoshangX+dangqiankuaidaxiao){chesser(zuoshangY+dangqiankuaidaxiao,zuoshangX,teshuY,teshuX,dangqiankuaidaxiao);}else{chess[zuoshangY+dangqiankuaidaxiao][zuoshangX+dangqiankuaidaxiao-1]=t;chesser(zuoshangY+dangqiankuaidaxiao,zuoshangX,zuoshangY+dangqiankuaidaxiao,zuoshangX+dangqiankuaidaxiao-1,dangqiankuaidaxiao);}//youxiaif(zuoshangY+dangqiankuaidaxiao<=teshuY&&zuoshangX+dangqiankuaidaxiao<=teshuX){chesser(zuoshangY+dangqiankuaidaxiao,zuoshangX+dangqiankuaidaxiao,teshuY,teshuX,dangqiankuaidaxiao);}else{chess[zuoshangY+dangqiankuaidaxiao][zuoshangX+dangqiankuaidaxiao]=t;chesser(zuoshangY+dangqiankuaidaxiao,zuoshangX+dangqiankuaidaxiao,zuoshangY+dangqiankuaidaxiao,zuoshangX+dangqiankuaidaxiao,dangqiankuaidaxiao);}
}int main()
{int n;//棋盘大小cin>>n;//input 0 无 -1有int X,Y;///横X,纵Ycin>>X>>Y;chess[X][Y]=-1;chesser(0,0,Y,X,n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){printf("%3d ",chess[i][j]);//cout<<chess[i][j]<<" ";}cout<<"\n";}return 0;
}///input
//8
//6 2

2、合并排序问题

对n个元素组成的序列进行排序。
基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个集合进行排序,最终将排序好的子集合合并成所要求的排好序的集合。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
void mergeer(int A[],int L[],int R[],int l,int r)
{int i=0,j=0;int k=0;while(i<l&&j<r)//首元素比较{if(L[i]<=R[j]){A[k++]=L[i++];}else{A[k++]=R[j++];}}///zuoyou剩余的部分复制进来while(i<1){A[k++]=L[i++];}//cout<<"#";while(j<r){A[k++]=R[j++];}
}void mergesort(int A[],int n)
{if(n>1){int mid=n/2;int *left=(int *)malloc(sizeof(int)*mid);int *right=(int *)malloc(sizeof(int)*(n-mid));for(int i=0;i<mid;i++){left[i]=A[i];}for(int i=mid;i<n;i++){right[i-mid]=A[i];}//  cout<<"*";mergesort(left,mid);mergesort(right,n-mid);mergeer(A,left,right,mid,n-mid);free(left);free(right);}}int main()
{int a[maxn]={0};int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}mergesort(a,n);for(int i=0;i<n;i++){cout<<a[i]<<" ";}return 0;
}
///input
//5
//2 3 6 5 1

3、集合最大元问题

在规模为n的数据元素集合中找出最大元。当n=2时,一次比较就可以找出两个数据元素的最大元和最小元。当n>2时,可以把n个数据元素分为大致相等的两半,一半有n/2个数据元素,而另一半有n/2个数据元素。 先分别找出各自组中的最大元,然后将两个最大元进行比较,就可得n个元素的最大元

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000int finder(int *a,int n)
{if(n==1){return a[0];}if(n==2)return max(a[0],a[1]);int mid=n/2;return max(finder(a,mid),finder(a+mid,n-mid));}
int main()
{int n;cin>>n;int a[maxn];for(int i=0;i<n;i++){cin>>a[i];}cout<<finder(a,n);return 0;
}
///input
//6
//2 3 5 6 4 1

4、循环赛日程表

2019年,德国甲级联赛刚刚落下帷幕。设有n支队伍参加循环赛,要求设计一个满足以下要求比赛日程表:
1)每支队伍必须与其它n-1支队伍各赛一次;
2)每支队伍一天只能赛一次。
输入:n=3
输出:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
int a[maxn][maxn]={0};
void TableCreate(int Size,int val,int x,int y)
{if (Size==2){a[x][y]=val;a[x+1][y]=val+1;a[x][y+1]=val+1;a[x+1][y+1]=val;return ;}int Currentsize=Size/2;if(Size%2!=0){cout<<"  WrongInput!"<<endl;}TableCreate(Currentsize,val,x,y);TableCreate(Currentsize,val,x+Currentsize,y+Currentsize);TableCreate(Currentsize,val+Currentsize,x+Currentsize,y);TableCreate(Currentsize,val+Currentsize,x,y+Currentsize);
}int main()
{int n; //队伍数cin>>n;TableCreate(n,1,1,1);for(int i = 1; i <=n; i++){for(int j = 1; j <= n; j++){printf("%3d",a[i][j]);}cout<<endl;}return 0;
}

五、实验结果与分析:
通过运行程序验证程序的正确性,给出程序运行结果,分析程序出现的bug的原因,调试程序过程种出现的错误和解决方法。

算法分析与设计-实验一 递归与分治算法设计相关推荐

  1. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  2. 中北大学算法分析与设计实验报告一(BF算法)

    中北大学算法分析与设计实验报告一(BF算法) 1.实验名称 实验一 算法基础实验:数理基础与串匹配程序设计 2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表.堆.栈等数据结构知识,基于BF算 ...

  3. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  4. 【算法设计与分析】14 分治算法的一般描述和分析方法

    本文主要描述分治算法的一般描述和分析方法.衔接上一篇文章:[算法设计与分析]13 分治策略的设计思想 文章目录 1 分治算法的一般性描述 1.1 分支算法的时间分析 1.2 两类常见的递推方程与求解方 ...

  5. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  6. koch算法c语言递归,【挑战程序设计竞赛】 递归与分治算法

    [挑战程序设计竞赛] 递归与分治算法 [挑战程序设计竞赛] 递归与分治算法 递归与分治算法穷举搜索题目 思路 代码 科赫曲线题目 思路 代码 将问题分解,通过求解局部性的小问题来解决原本的问题,这种技 ...

  7. linux算法设计,嵌入式Linux平台下随机序列算法设计.doc

    嵌入式Linux平台下随机序列算法设计 嵌入式Linux平台下随机序列算法设计 [摘 要]本文以多媒体播放器的随机不重复播放机能为切入点,针对嵌入式平台实时性要求高,处理速度不够快,但系统存储歌曲量大 ...

  8. 算法实验一 递归与分治策略

    递推/递归与分治策略1 实验题目:王老师爬楼梯 题目描述: 王老师爬楼梯,他可以每次走1级或者2级或者3级楼梯,输入楼梯的级数,求不同的走法数.(要求递推求解)如果N很大,需要高精度计算. 输入要求: ...

  9. 算法设计与分析——递归与分治策略——最接近点对问题

    [问题描述] 最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点.设 p1(x1,y1),p2(x2,y2),--,pn(xn,yn)是平面的n个点. 严格地将,最近点对可能不止一对,此例输 ...

  10. 杭电编译原理实验-实验二-递归下降分析子程序设计

    递归下降分析子程序设计 实验目的 实验内容 函数定义 程序流程图 源代码 测试用例 实验目的   掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递 ...

最新文章

  1. New Video Game Controlled By Kissing
  2. ◎◎identity ,ident_current() ,scope_identity的区别
  3. ARKit从入门到精通(7)-ARCamera介绍
  4. 如何开发出优秀的APICloud应用
  5. PHP编写命令行脚本和后台运行程序的注意事项
  6. 简单工厂模式(Simple Factory Pattern)
  7. 案例 录入并获取一个班级的平均分
  8. 【转】【Java/Android】Toast使用方法大全
  9. Kudu : 三种Fulsh Mode
  10. [转载]oracle定时器
  11. Linux权限z代表什么,linux用户与权限使用方法
  12. SAP License:值字段更改注意事项
  13. 创建一个新的extender
  14. Navicat的使用,连表查询,python代码操作sql语句
  15. 监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
  16. 脚本实现为一系列账号生成随机密码
  17. Eclipse Memory Analyzer,内存泄漏插件,安装使用
  18. 农夫过河算法最简便的c语言,C语言农夫过河
  19. Meld Diff for windows 安装配置
  20. 经济机器是怎么运行的

热门文章

  1. 怎样修改MTK Scatter 文件
  2. FPGA图像处理基础----直方图均衡化
  3. MATLAB符号运算部分知识总结
  4. android webview最新版下载,AndroidWebView
  5. Python测试题20道(含答案)
  6. html分页过多,实现分页处理,固定分页数目,数目始终中间显示,自定义分页跳转(在结尾的代码)
  7. 用cubesuite烧写器报下列错误: [Direct Error Cause] Incorrect ID Code.(C0602202)
  8. python数据转换成pdf_用python把ipynb文件转换成pdf文件过程详解
  9. Windows Server 2008 R2 企业版操作说明手册
  10. idea生成class文件反编译后中文乱码