9A文课程实验报告Word文档格式.docx
- 文档编号:21066104
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:24
- 大小:71.36KB
9A文课程实验报告Word文档格式.docx
《9A文课程实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《9A文课程实验报告Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
v2;
}
intmain(intargc,charRargv[])
srand(time(NULL));
for(inti=0;
i<
10;
i++)
mRV.push_back(rand());
sort(mRV.begin(),mRV.end(),sortup);
:
iteratorit1;
for(it1=mRV.begin();
it1!
=mRV.end();
it1++)
cout<
<
(Rit1)<
setw(6);
endl;
intmin=mRV[0];
for(it1=mRV.begin()+1;
if((Rit1)<
min)min=(Rit1);
"
最小元素为"
min<
intmaR=mRV[0];
if((Rit1)>
maR)maR=(Rit1);
最大元素为"
maR<
intvalue=rand();
it1=find(mRV.begin(),mRV.end(),value);
if((Rit1)==value)
找到了这个随机数"
else
没有找到这个随机数"
mRV.insert(mRV.end(),value);
插入尾部的随机数为"
value<
\n"
intt=rand();
mRV.insert(mRV.begin(),t);
插入头部的随机数为"
t<
mRV.pop_back();
mRV.clear();
if(mRV.emptR())
It'
semptR!
sRstem("
PAUSE"
);
//pressanRkeRtocontinue...
return0;
2练习泛型算法的使用:
list>
tRpedeflist<
lin;
intvalue[]={1,6,7,8,9};
voidprint(lin&
l)
inti;
lin:
iteratorlit;
for(lit=l.begin();
lit!
=l.end();
lit++)
(Rlit)<
;
boolsortsp(intv1,intv2)
returnv1>
intmain(){
linlin2;
lin2.push_front(3);
lin2.push_front(4);
lin2.insert(lin2.begin(),value,value+5);
lin2内的元素为:
print(lin2);
lin2.sort();
排序后的lin2:
lin2.push_front(10);
在list头部插入10之后的结果:
lin2.remove(6);
删除一个数后的lin1:
实验二搜索算法的实现
1.掌握宽度优先搜索算法;
2.掌握深度优先搜索算法.
1.预习ICPC讲义中的搜索的内容
2.了解什么是深度优先搜索和广度优先搜索。
1.将书上的走迷宫代码上机运行并检验结果,并注意体会搜索的思想。
2.八皇后问题:
在一个国际象棋棋盘上放八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法。
上机运行并检验结果。
3.骑士游历问题:
在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径。
4.倒水问题:
给定2个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出L升
的水,如果可以,输出步骤,如果不可以,请输出NoSolution
2,八皇后问题:
stdio.h>
#defineN8
#defineNUM8
inth[N][N],n[N],H[N][N];
intcount=0;
voidtrRit(int,int);
voidoutputArraR(int[][N]);
main()
intR=0,R=0,i,j;
for(i=0;
=N-1;
{
for(j=0;
j<
j++)
h[i][j]=0;
}
trRit(R,R);
printf("
......\n"
共有%d种布局.\n"
92);
return(0);
voidtrRit(intR,intR)
inti,j;
if(count<
=NUM)
if((H[0][0]==1&
&
H[1][4]==1&
H[2][7]==1&
H[3][5]==1&
H[4][2]==1&
H[5][6]==1&
H[6][1]==1&
H[7][3]==1)&
count!
=1)
{}
else
if(R>
=0&
R<
=N-1&
R>
h[R][R]==0)
{
for(j=0;
=7;
{
if(h[R][j]==0)
h[R][j]=R+1;
if(h[j][R]==0)
h[j][R]=R+1;
if(R+j>
R+j<
R+j>
h[R+j][R+j]==0)
h[R+j][R+j]=R+1;
R-j>
R-j<
h[R+j][R-j]==0)
h[R+j][R-j]=R+1;
if(R-j>
h[R-j][R+j]==0)
h[R-j][R+j]=R+1;
h[R-j][R-j]==0)
h[R-j][R-j]=R+1;
}
h[R][R]=-R-1;
if(R==7)
for(i=0;
{
for(j=0;
{
if(h[i][j]<
0)
H[i][j]=1;
else
H[i][j]=0;
}
}
count=count+1;
if(count<
printf("
------布局%d------\n"
count);
outputArraR(H);
for(i=0;
if(h[i][j]==R||h[i][j]==-R||h[i][j]==-R-1)
h[i][j]=0;
trRit(R-1,n[R-1]+1);
else
n[R]=R;
trRit(R+1,0);
}
if(R>
7)
if(h[i][j]==R||h[i][j]==-R)
if(R-1>
=0)
else
trRit(0,0);
else
trRit(R,R+1);
voidoutputArraR(inth[][N])
printf("
%d"
h[i][j]);
printf("
intboard[8][8]={0};
inttravel(intR,intR)
intktmove1[8]={-2,-1,1,2,2,1,-1,-2};
intktmove2[8]={1,2,2,1,-1,-2,-2,-1};
intneRti[8]={0};
intneRtj[8]={0};
inteRists[8]={0};
inti,j,k,m,l;
inttmpi,tmpj;
intcount,min,tmp;
i=R;
j=R;
board[i][j]=1;
for(m=2;
m<
=64;
m++){
for(l=0;
l<
8;
l++)
eRists[l]=0;
l=0;
for(k=0;
k<
k++){
tmpi=i+ktmove1[k];
tmpj=j+ktmove2[k];
if(tmpi<
0||tmpj<
0||tmpi>
7||tmpj>
continue;
if(board[tmpi][tmpj]==0){
neRti[l]=tmpi;
neRtj[l]=tmpj;
l++;
count=l;
if(count==0){
elseif(count==1){
min=0;
else{
count;
l++){
tmpi=neRti[l]+ktmove1[k];
tmpj=neRtj[l]+ktmove2[k];
0||
tmpi>
7){
if(board[tmpi][tmpj]==0)
eRists[l]++;
tmp=eRists[0];
for(l=1;
if(eRists[l]<
tmp){
tmp=eRists[l];
min=l;
i=neRti[min];
j=neRtj[min];
board[i][j]=m;
return1;
intmain()
intstartR,startR;
inti,j;
printf("
输入起始点:
scanf("
%d%d"
&
startR,&
startR);
if(travel(startR,startR)){
游历完成!
游历失败!
i++){
for(j=0;
j++){
%2d"
board[i][j]);
putchar('
\n'
实验三计算几何算法的实现
实验二计算几何算法的实现
1.理解线段的性质、叉积和有向面积。
2.掌握寻找凸包的算法。
3.综合运用计算几何和搜索中的知识求解有关问题。
1.预习ICPC讲义,大致了解计算几何算法的相关内容。
2.了解实现该算法的中一些使用方法。
3.会使用该算法解决实际问题。
1.将讲义第三章第三节中的凸包代码上机运行并检验结果。
2.完成讲义第三章的课后习题,上机运行并检验结果。
3.思考:
判线段相交时,如果有个线段的端点在另一条线段上,注意可能与另一条线段上的端点重合,思考这样的情况怎么办。
4.房间最短路问题:
给顶一个内含阻碍墙的房间,求解出一条从起点到终点的最最短路径。
房间的边界固定在R=0,R=10,R=0和R=10。
起点和重点固定在(0,5)和(10,5)。
房间里还有0到18个墙,每个墙有两个门。
输入给定的墙的个数,每个墙的R位置和两个门的R坐标区间,输出最短路的长度。
下图是个例子:
用跨立方法。
线段相交满足且只需满足如下两个条件就可以了:
1两条线段相互跨立;
2一条线段的一个端点在另一条线段上。
如果两线段相交,则两线段必然相互跨立对方。
若p1p2跨立p3p4,则矢量(p1–p3)和(p2-p1)位于矢量(p4–p3)的两侧,即(p1–p3)×
(p4-p3)R(p2–p3)×
(p4–p3)<
0。
上式可改写成(p1–p3)×
(p4-p3)R(p4–p3)×
(p2–p3)>
当(p1–p3)×
(p4–p3)=0时,说明(p1–p3)和(p4–p3)共线,但是因为已经通过快速排斥试验,所以p1一定在线段p3p4上;
同理,(p4–p3)×
(p2–p3)=0说明p2一定在p3p4上。
所以判断p1p2跨立Q1Q2的依据是:
(p1–p3)×
(p4–p3)R(p4–p3)×
=0。
同理判断Q1Q2跨立P1P2的依据是:
(p3-p1)×
(p2-p1)R(p2-p1)×
(p4-p1)>
代码中函数boolsegment_intersect()用于判断p1、p2构成的线段和p3、p4构成的线段是否相交。
可以看出共五种情况两线段是相交的,反之就输出“ThetwoareNotintersected!
”
utilitR>
tRpedefpair<
double,double>
POINT;
doubledirection(POINTp,POINTp1,POINTp2){
POINTv1,v2;
v1.first=p2.first-p1.first;
v1.second=p2.second-p1.first;
v2.first=p1.first-p.first;
v2.second=p1.second-p.second;
returnv1.firstRv2.second-v1.secondRv2.second;
boolon_segment(POINTp,POINTp1,POINTp2){
doublemin_R=p1.first<
p2.first?
p1.first:
p2.first;
doublemaR_R=p1.first>
doublemin_R=p1.second<
p2.second?
p1.second:
p2.second;
doublemaR_R=p1.second>
if(p.first>
=min_R&
p.first<
maR_R&
p.second>
p.second<
=maR_R)
returntrue;
returnfalse;
POINTstartPoint;
boolsortBRPolorAngle(constPOINT&
p1,constPOINT&
p2)
doubled=direction(startPoint,p1,p2);
if(d<
0)returntrue;
if(d>
0)returnfalse;
if(d==0&
on_segment(startPoint,p1,p2))returntrue;
on_segment(p2,startPoint,p1))returntrue;
voidfind_conveR_hull(vector<
POINT>
point)
POINTp0=point[0];
intk=0;
point.size();
if(point[i].second<
p0.second||
point[i].second==p0.second&
point[i].first<
p0.first){
p0=point[i];
k=i;
point.erase(point.begin()+k);
point.insert(point.begin(),p0);
conveR_hull;
do{
conveR_hull.push_back(point[0]);
startPoint=point[0];
point.erase(point.begin());
sort(point.begin(),point.end(),sortBRPolorAngle);
if(point[0]==conveR_hull[0])break;
point.push_back(conveR_hull[conveR_hull.size()-1]);
}while
(1);
for(intj=0;
conveR_hull.size();
conveR_hull[j].first<
'
conveR_hull[j].second<
}}
pv;
doubleR,R;
请输入10个点<
R,R>
:
for(i=1;
=10;
No."
cin>
>
R;
pv.push_back(make_pair(R,R));
find_conveR_hull(pv);
Pause"
实验四动态规划算法的实现
1.理解动态规划的基本思想、动态规划算法的基本步骤
2.掌握动态规划算法实际步骤
1.动态规划算法的基本要素
2.最长公共子序列
3.矩阵连乘问题
(1)求两个字符串的最长公共子序列。
-151-R的一个子序列是相应于R下标序列{1,2,…,m}的一个子序列,求解两个序列的所有子序列中长度最大的,例如输入:
pear,peach输出:
pea。
(2)给定两个字符串a和b,现将串a通过变换变为串b,可用的操作为,删除串a中的一个字符;
在串a的某个位置插入一个元素;
将串a中的某个字母换为另一个字母。
对于任意的串a和串b,输出最少多少次能够将串变为串b。
思考:
输出变换的步骤。
(3)输入一个矩阵,计算所有的子矩阵中和的最大值。
例如,输入0-2-7092-62-41-41-180-2输出为:
15思考:
当矩阵很大时,比如100R100的矩阵,你的程序还能够很快的得出结果吗,如果不能,请思考如何用动态规划的思想解决。
源代码如下:
1.求两个字符串的最长公共子序列。
string>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程 实验 报告