西安交通大学算法上机实验报告Word文件下载.docx
- 文档编号:21387502
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:25
- 大小:434.86KB
西安交通大学算法上机实验报告Word文件下载.docx
《西安交通大学算法上机实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《西安交通大学算法上机实验报告Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
<
iostream>
2.#include
cstdio>
3.#include
algorithm>
4.#include
cstring>
5.#include
queue>
6.#include
set>
7.#include
map>
8.#include
time.h>
9.using
namespace
std;
10.
11.int
sale[1000][6]
=
{0};
//分别表示每个优惠中每个商品数量
12.int
saleprice[1000]
//优惠总价
13.int
salelength[1000]
//优惠总共有几个商品
14.int
salenumber[1000][1000]
//优惠商品的ID
15.int
good[6][4]
//1
->
number
2
price
3
last
num
16.int
num[1000];
//商品ID
17.int
dp[6][6][6][6][6];
18.int
n,m;
19.
20.void
input()
21.{
cout<
"
input.txt"
endl;
22.
cin>
>
n;
23.
for(int
i
1;
i++)
24.
{
25.
good[i][1]>
good[i][3]>
good[i][2];
26.
num[i]
good[i][1];
27.
}
28.cout<
offer.txt"
29.
m;
30.
31.
32.
salelength[i];
33.
j
j++)
34.
35.
salenumber[i][j];
36.
sale[i][salenumber[i][j]];
37.
38.
saleprice[i];
39.
40.}
41.
42.void
output()
43.{
44.
45.
cout<
goodnum:
good[i][1]<
goodprice:
good[i][2]<
goodlast:
good[i][3]<
46.
47.
48.
//cout<
salelength[i]<
49.
sale"
i<
:
;
50.
51.
num:
salenumber[i][j]<
count:
sale[i][salenumber[i][j]]<
52.
53.
price:
saleprice[i]<
54.
55.
56.}
57.int
main()
58.{
59.
//freopen("
in2"
"
r"
stdin);
60.
input();
61.
//
output();
62.
dp[0][0][0][0][0]
0;
63.
good[1][3];
64.
j=
good[2][3];
65.
k
good[3][3]
k++)
66.
l
good[4][3];
l++)
67.
p
good[5][3];
p++)
68.{
69.int
minx
*
good[1][2]
+
good[2][2]
good[3][2]
70.
good[4][2]
good[5][2];
71.
q
q++)
72.
73.
if(i
-sale[q][num[1]]<
0
||
-
sale[q][num[2]]<
i-sale[q][num[3]]<
i-sale[q][num[4]]<
||i-sale[q][num[5]]<
0)
continue;
74.
int
t
dp[i
sale[q][num[1]]][j
sale[q][num[2]]][k
sale[q][num[3]]][l
sale[q][num[4]]][p
sale[q][num[5]]]
saleprice[q];
75.
76.
if(t
minx)
t;
77.
78.
79.
dp[i][j][k][l][p]
minx;
80.}
output.txt"
81.
dp[good[1][3]][good[2][3]][good[3][3]][good[4][3]][good[5][3]]<
82.return
83.}
输出结果:
算法实现题3-15收集样本问题
机器人Rob在一个有n*n个方格的方形区域F中收集样本。
(i,j)方格中样本的价值为v(i,j),如图3-8所示。
Rob从方形区域F的左上角A点出发,向下或向右行走,直到右下角的B点,在走过的路上,收集方格中的样本。
Rob从A点到B点共走2次,试找出Rob的2条行走路径,使其取得的样本总价值最大。
给定方形区域F中的样本分布,编程计算Rob的2条行走路径,使其取得的样本总价值最大。
由文件input.txt给出输入数据。
第1行有1个正整数n,表示方形区域F有n*n个方格。
接下来每行有3个整数,前2个表示方格位置,第3个数为该位置样本价值。
最后一行是3个0。
将计算的最小平均等待时间输出到文件output.txt。
由于机器人只能往右走或向下走,所以如果每个位置走过后,它左边或上边的点就不需要考虑了。
每个机器人到达终点时都经过2*n-1步。
可以设h[x1][y1][x2][y2]表示第一个机器人到达(x1,y1)第二个机器人走到(x2,y2)时的最优值。
如果现在为第S步,如果某个机器的X坐标被确定,那么它的Y坐标也可以推出来(有X+Y=S–2)。
于是我们可以有在第由第S步的最大值去更新S+1步的最大值即可。
而在S步时,可以根据所在的两个位置选择一个方向进行推导(共四个,每个机器人往下或往右)。
更新时需要注意如果两个机器人走到同一个格子时,它的值只更新一次(每个样本只能收集一次)。
代码如下:
ackageexercise;
importjava.io.BufferedWriter;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.util.Scanner;
importsupportclass.SampleGet;
publicclassCh3_R3_15{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
SampleGetcurSamplemap=getSample();
curSamplemap.getBestSample();
BufferedWriteroutput=newBufferedWriter(newFileWriter("
));
//将结果通过output.write()输出
output.write("
+curSamplemap.getResult());
output.close();
}
publicstaticSampleGetgetSample()throwsIOException{
Scannerinput=newScanner(newFileReader("
input.useDelimiter("
\n"
);
intsampleamount=Integer.parseInt(input.next().trim());
SampleGetsamplemap=newSampleGet(sampleamount);
while(true){
String[]cur=input.next().split("
"
if(Integer.parseInt(cur[2].trim())!
=0){
samplemap.setSamplePoint(Integer.parseInt(cur[0]),Integer.parseInt(cur[1]),Integer.parseInt(cur[2].trim()));
}
else{
break;
}
input.close();
returnsamplemap;
}
packagesupportclass;
publicclassSampleGet{
int[][]samplemap;
int[][][][]mostvalue;
intrank;
publicSampleGet(intrank){
//TODOAuto-generatedconstructorstub
this.rank=rank;
samplemap=newint[rank*2][rank*2];
mostvalue=newint[rank*2][rank*2][rank*2][rank*2];
publicintgetRank(){
returnrank;
publicvoidgetBestSample(){
for(ints=2;
s<
=2*rank-1;
++s){
for(intx1=1;
x1<
=s-1;
++x1){
for(intx2=1;
x2<
++x2){
inty1=s-x1;
inty2=s-x2;
intvalue=mostvalue[x1][y1][x2][y2];
dynamicUpdate(x1+1,y1,x2+1,y2,value);
dynamicUpdate(x1+1,y1,x2,y2+1,value);
dynamicUpdate(x1,y1+1,x2+1,y2,value);
dynamicUpdate(x1,y1+1,x2,y2+1,value);
}
publicvoidsetSamplePoint(intcoor_x,intcoor_y,intvalue){
samplemap[coor_x-1][coor_y-1]=value;
privatevoiddynamicUpdate(intx1,inty1,intx2,inty2,intvalue){
if(x1==x2&
&
y1==y2){
this.mostvalue[x1][y1][x2][y2]=Math.max(mostvalue[x1][y1][x2][y2],value+samplemap[x1][y1]);
else{
this.mostvalue[x1][y1][x2][y2]=Math.max(mostvalue[x1][y1][x2][y2],value+samplemap[x1][y1]+samplemap[x2][y2]);
publicintgetResult(){
returnthis.mostvalue[rank-1][rank-1][rank-1][rank-1];
算法实现题4-9汽车加油问题
一辆汽车加满油后可以行驶N千米。
旅途中有若干个加油站。
设计一个有效的算法,指出应在那些加油站停靠加油,指出若要使沿途的加油次数最少。
对于给定的n和k个加油站位置,计算最少加油次数。
第一行有2个正数n和k,表示汽车加满油后可行使的距离nkm,且旅途中有k个加油站。
接下来的一行中有k+1个整数,表示第k个加油站和第k-1个加油站之间的距离。
第0个加油站表示出发点,汽车已加满油。
第k+1ge加油站表示目的地。
将计算的最少加油次数输出到文件output.txt。
如果无法到达目的地,则输出“Nosolution”。
对于这个问题我们有以下几种情况:
设加油次数为k,每个加油站间距离为a[i];
i=0,1,2,3……n
1.始点到终点的距离小于N,则加油次数k=0;
2.始点到终点的距离大于N,
A加油站间的距离相等,即a[i]=a[j]=L=N,则加油次数最少k=n;
B加油站间的距离相等,即a[i]=a[j]=L>
N,则不可能到达终点;
C加油站间的距离相等,即a[i]=a[j]=L<
N,则加油次数k=n/N(n%N==0)或k=[n/N]+1(n%N!
=0);
D加油站间的距离不相等,即a[i]!
=a[j],则加油次数k通过以下算法求解。
#include<
stdlib.h>
fstream>
usingnamespacestd;
ifstreamfin("
ofstreamfout("
voidjiayou(intn,intk,int*a)
{//n为加满油后汽车的行程,k为途中加油站的个数
intcount=0;
//加油次数
intsoil=n;
//油箱中剩余油量
for(inti=0;
i<
k+1;
i++)
{
soil=soil-a[i];
if(soil<
=0)
{
soil=n;
//加满油
count+=1;
//加油次数加一
soil-=a[i];
fout<
count;
intmain()
{
intn,k;
fin>
n;
k;
int*a=newint[n];
for(intj=0;
j<
=n;
j++)
fin>
a[j];
jiayou(n,k,a);
return0;
算法实现题5-12罗密欧与朱丽叶的迷宫问题
罗密欧与朱丽叶身处一个m×
n的迷宫中,如图所示。
每一个方格表示迷宫中的一个房间。
这m×
n个房间中有一些房间是封闭的,不允许任何人进入。
在迷宫中任
何位置均可沿8个方向进入未封闭的房间。
罗密欧位于迷宫的。
(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。
在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。
每改变一次前进方向算作转弯一次。
请设计一个算法帮助罗密欧找出这样一条路。
对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少弯道路
由文件input.txt给出输入数据。
第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。
接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。
最后的2行,每行也有2个正整数,分别表示罗密欧所处的方格(p,q)和朱丽叶所处的方格(r,s)。
将计算出的罗密欧通向朱丽叶的最少转弯次数和有多少条不同的最少转弯道路输出到文件output.txt。
文件的第1行是最少转弯次数。
第2行是不同的最少转弯道路数。
接下来的n行每行m个数,表示迷宫的一条最少转弯道路。
A[i][j]=k表示第k步到达方格(i,j);
A[i][j]=-1表示方格(i,j)是封闭的。
如果罗密欧无法通向朱丽叶,则输出”NoSolution!
”。
#include<
iostream.h>
intm,n,k;
//m*n迷宫,k个封闭房间
intx,y;
//迷宫中封闭房间的坐标
intp,q,r,s;
//罗密欧与朱丽叶的坐标
int**square;
//存储迷宫
int*dir;
//用来记录每一步的方向
intlevel(0);
//记录正在探测第几步
intfinalLevel(0);
//初始化为零
int**result;
//记录结果
int**path;
intturn(999);
//记录最小拐弯数
intdirx[8]={0,0,1,1,1,-1,-1,-1};
//8个方向变量
intdiry[8]={1,-1,-1,0,1,-1,0,1};
booltrackback(intp,intq);
boolIsFull();
voidmain()
inti,j;
cin>
m>
n>
result=newint*[2];
result[0]=newint[n*m];
result[1]=newint[n*m];
path=newint*[2];
path[0]=newint[n*m];
path[1]=newint[n*m];
dir=newint[m*n];
square=newint*[m+2];
//m+2是为了方便边界处理
for(i=0;
m+2;
square[i]=newint[n+2];
//n+2是也是为了方便边界处理
i++)//初始化square迷宫
for(j=0;
j<
n+2;
square[i]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安交通大学 算法 上机 实验 报告