算法分析与设计-实验一 递归与分治算法设计
文章目录
- 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的原因,调试程序过程种出现的错误和解决方法。
算法分析与设计-实验一 递归与分治算法设计相关推荐
- 算法设计与分析——递归与分治策略——全排列
算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...
- 中北大学算法分析与设计实验报告一(BF算法)
中北大学算法分析与设计实验报告一(BF算法) 1.实验名称 实验一 算法基础实验:数理基础与串匹配程序设计 2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表.堆.栈等数据结构知识,基于BF算 ...
- 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...
- 【算法设计与分析】14 分治算法的一般描述和分析方法
本文主要描述分治算法的一般描述和分析方法.衔接上一篇文章:[算法设计与分析]13 分治策略的设计思想 文章目录 1 分治算法的一般性描述 1.1 分支算法的时间分析 1.2 两类常见的递推方程与求解方 ...
- 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...
<太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...
- koch算法c语言递归,【挑战程序设计竞赛】 递归与分治算法
[挑战程序设计竞赛] 递归与分治算法 [挑战程序设计竞赛] 递归与分治算法 递归与分治算法穷举搜索题目 思路 代码 科赫曲线题目 思路 代码 将问题分解,通过求解局部性的小问题来解决原本的问题,这种技 ...
- linux算法设计,嵌入式Linux平台下随机序列算法设计.doc
嵌入式Linux平台下随机序列算法设计 嵌入式Linux平台下随机序列算法设计 [摘 要]本文以多媒体播放器的随机不重复播放机能为切入点,针对嵌入式平台实时性要求高,处理速度不够快,但系统存储歌曲量大 ...
- 算法实验一 递归与分治策略
递推/递归与分治策略1 实验题目:王老师爬楼梯 题目描述: 王老师爬楼梯,他可以每次走1级或者2级或者3级楼梯,输入楼梯的级数,求不同的走法数.(要求递推求解)如果N很大,需要高精度计算. 输入要求: ...
- 算法设计与分析——递归与分治策略——最接近点对问题
[问题描述] 最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点.设 p1(x1,y1),p2(x2,y2),--,pn(xn,yn)是平面的n个点. 严格地将,最近点对可能不止一对,此例输 ...
- 杭电编译原理实验-实验二-递归下降分析子程序设计
递归下降分析子程序设计 实验目的 实验内容 函数定义 程序流程图 源代码 测试用例 实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递 ...
最新文章
- New Video Game Controlled By Kissing
- ◎◎identity ,ident_current() ,scope_identity的区别
- ARKit从入门到精通(7)-ARCamera介绍
- 如何开发出优秀的APICloud应用
- PHP编写命令行脚本和后台运行程序的注意事项
- 简单工厂模式(Simple Factory Pattern)
- 案例 录入并获取一个班级的平均分
- 【转】【Java/Android】Toast使用方法大全
- Kudu : 三种Fulsh Mode
- [转载]oracle定时器
- Linux权限z代表什么,linux用户与权限使用方法
- SAP License:值字段更改注意事项
- 创建一个新的extender
- Navicat的使用,连表查询,python代码操作sql语句
- 监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
- 脚本实现为一系列账号生成随机密码
- Eclipse Memory Analyzer,内存泄漏插件,安装使用
- 农夫过河算法最简便的c语言,C语言农夫过河
- Meld Diff for windows 安装配置
- 经济机器是怎么运行的
热门文章
- 怎样修改MTK Scatter 文件
- FPGA图像处理基础----直方图均衡化
- MATLAB符号运算部分知识总结
- android webview最新版下载,AndroidWebView
- Python测试题20道(含答案)
- html分页过多,实现分页处理,固定分页数目,数目始终中间显示,自定义分页跳转(在结尾的代码)
- 用cubesuite烧写器报下列错误: [Direct Error Cause] Incorrect ID Code.(C0602202)
- python数据转换成pdf_用python把ipynb文件转换成pdf文件过程详解
- Windows Server 2008 R2 企业版操作说明手册
- idea生成class文件反编译后中文乱码