程序设计方法与艺术 小组解题报告模板

合集下载

C语言程序设计大作业报告模板样本

C语言程序设计大作业报告模板样本

《C语言程序设计》大作业报告1.目掌握所学C语言程序设计办法,熟悉所学语言开发环境及调试过程,熟悉所学C语言中数据类型,数据构造、语句构造、运算办法,巩固和加深对理论课中知识理解,提高学生对所学知识综合运用能力。

通过综合设计规定达到下列基本技能:1.培养查阅参照资料、手册自学能力,通过独立思考进一步钻研问题,学会自己分析、解决问题。

2.通过对所选题目方案分析比较,确立方案,编制与调试程序,初步掌握程序设计办法,能纯熟调试程序。

2.作业内容纯熟掌握所学语言基本知识:数据类型(整形、实型、字符型、指针、数组、构造等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序构造(顺序构造、判断选取构造、循环构造);大程序功能分解办法(即函数使用)等。

进一步掌握各种函数应用等。

3.规定:1.规定每个同窗都要认真对待,积极参加。

2.独立完毕,不能抄袭。

3.课程设计结束时每位同窗必要完毕《大作业报告册》,其中包括设计源代码和设计思路。

4.不符合规定程序、设计报告、抄袭设计报告或源程序代码、在设计中完全未参加将作不及格解决。

5.统一格式,A4打印,准时提交。

4.题目:设计规定:编写一种程序,求3x4数组转置矩阵。

规定在main函数里面读数,在change函数里面把矩阵转置。

5.程序设计5.1 设计思路:1是先定义两个数组,一种是a[3][4],另一种是b[4][3]。

2是将随便输入12个数输入到a[3][4]。

3是在change函数中将a[3][4]中值通过for循环镶嵌将数组a[3][4]值赋值给数组b[4][3]。

4在主函数中将数组b[4][3]通过for循环嵌套输出。

5.2 代码# include <stdio.h>int change (int a[3][4],int b[4][3]);main(){ int a[3][4],b[4][3],i,j;printf("please input some 12 numbers:"); for(i=0;i<3;i++){printf("\n");for(j=0;j<=3;j++)scanf ("%d",&a[i][j]);}change (a,b);for(i=0;i<4;i++){for(j=0;j<3;j++)printf("%5d",b[i][j]);printf("\n");}}int change (int a[3][4],int b[4][3]){int m,n;for(m=0;m<3;m++)for(n=0;n<4;n++)b[n][m]=a[m][n]; retrun 0;}5.3 成果6.心得体会编写时注意for循环嵌套,先理清逻辑关系在编写,在看例题后,需要多敲代码,才干越来越纯熟。

程序设计实习报告小组互助

程序设计实习报告小组互助

程序设计实习报告小组互助一、前言随着科技的不断发展,计算机技术在各行各业中的应用越来越广泛,程序设计能力已成为当代大学生必备的技能之一。

为了提高我们的实践能力和团队协作精神,学校为我们安排了程序设计实习课程。

在这个课程中,我们小组成员相互学习、相互帮助,共同完成了多项任务,取得了很好的成果。

在此,我将对我们的实习过程进行总结,以期为今后的学习和工作提供借鉴。

二、实习任务及分工在实习过程中,我们小组共完成了三个任务:分别是设计一个简单的计算器程序、实现一个学生信息管理系统以及编写一个网络聊天室。

为了高效地完成这些任务,我们首先对每个任务进行了详细的分析和讨论,然后根据每个人的特长进行了分工。

1. 设计一个简单的计算器程序这个任务主要考察我们的基本编程能力。

我们小组讨论后决定使用 C 语言来实现计算器的基本功能,如加、减、乘、除等。

根据分工,我负责编写加、减、乘、除运算的函数,而其他组员则负责主函数和用户界面。

在编程过程中,我们遇到了一些问题,如如何处理用户输入的错误数据等。

通过相互讨论和查找资料,我们成功解决了这些问题,并完成了计算器程序的设计。

2. 实现一个学生信息管理系统这个任务要求我们运用面向对象的思想,设计一个具有增删改查功能的学生信息管理系统。

我们小组决定使用 Java 语言来实现这个系统。

根据分工,我负责实现查询功能,其他组员则负责实现添加、删除和修改功能。

在实现过程中,我们遇到了一些技术难题,如如何实现数据持久化、如何设计合理的数据库结构等。

我们通过小组互助,共同学习相关技术,最终成功完成了学生信息管理系统的设计。

3. 编写一个网络聊天室这个任务是一个综合性的实践项目,要求我们运用网络编程知识,实现一个可以实时通信的聊天室。

我们小组决定使用 C++ 和 W indows Socket 编程来实现这个聊天室。

根据分工,我负责实现客户端程序,其他组员则负责实现服务器端程序。

在编程过程中,我们遇到了一些难题,如如何实现数据的实时传输、如何处理并发请求等。

程序设计与问题求解实验报告_概述说明

程序设计与问题求解实验报告_概述说明

程序设计与问题求解实验报告概述说明1. 引言1.1 概述在计算机科学领域中,程序设计与问题求解是一项重要的技能。

通过编写代码来解决实际问题,不仅需要掌握基本的编程语言知识,还需要具备问题分析和解决的能力。

本次实验报告旨在介绍程序设计与问题求解实验的背景、目的和内容。

1.2 文章结构本篇文章将按照以下结构进行论述:引言、正文、实验过程、结果分析和结论。

引言部分将介绍本次实验报告的概述以及文章结构,正文部分将详细阐述相关理论和方法,实验过程将描述具体的实验步骤和操作流程,结果分析将对实验结果进行评估和解释,最后结论部分将总结本次实验的主要发现并提出进一步讨论和改进的建议。

1.3 目的本次实验报告的目的在于帮助读者了解程序设计与问题求解这门课程涉及到的内容和相关概念。

通过阅读本报告,读者可以获得关于程序设计与问题求解所需知识以及应用技巧方面的指导,并更好地理解该领域中涉及到的核心概念和方法。

读者可以通过本次实验报告对程序设计与问题求解这门课程有一个整体的了解,为将来的学习和实践提供指导。

同时,本报告还将根据实际的案例和问题,进行详细的分析和讨论,以便读者能够更清楚地理解和运用所学知识。

总之,本次实验报告旨在引导读者深入学习程序设计与问题求解,并在实际应用中能够熟练掌握相关技巧。

希望本篇文章对读者有所启发,并能成为学习和实践的参考资料。

2. 正文在此部分,我们将详细介绍程序设计与问题求解的实验过程以及相关内容。

2.1 程序设计的基本概念在开始实验之前,我们需要先了解一些程序设计的基本概念。

程序是由一系列指令组成的,用于解决特定问题或实现特定功能。

而程序设计则是指根据问题需求或功能要求编写出这些指令的过程。

2.2 问题求解方法程序设计与问题求解密切相关,因为程序就是为了解决问题而存在的。

在本次实验中,我们将学习和掌握一些常用的问题求解方法。

2.2.1 分析问题在开始编写代码之前,我们需要先对待解决的问题进行充分分析。

《程序设计艺术与方法》课程实验报告材料的

《程序设计艺术与方法》课程实验报告材料的

《程序设计艺术与方法》课程实验报告一二实验名称搜索算法的实验姓名系院专业信息工程系班级物联网一班学号实验日期指导教师成绩一、实验目的和要求1.掌握宽度优先搜索算法。

2.掌握深度优先搜索算法。

二、实验预习内容1宽度优先搜索算法:又称广度优搜索。

是最简单的图的算法的原形。

其属于一种盲搜寻法,目的是系统地展开并检查图中的所有节点,以寻找结果。

换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

2深度优先搜索算法:它的目的是要达到被搜索结构的叶结点。

在一个HTML文件中,当一个超链被选择后,被连接的HTML文件将执行深度优先搜索,即在搜索其余的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。

当不再有其他超链可选择时,说明搜索已经结束。

三、实验项目摘要1.将书上的走迷宫代码上机运行并检验结果,并注意体会搜索的思想。

2 .八皇后问题:在一个国际象棋棋盘上放八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法。

上机运行并检验结果。

思考:将此题推广到N 皇后的情况,检验在N 比较大的情况下,比方说N=16 的时候,你的程序能否快速的求出结果,如果不能,思考有什么方法能够优化算法。

3骑士游历问题:在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径。

4 倒水问题:给定2 个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出L 升的水,如果可以,输出步骤,如果不可以,请输出No Solution。

四、实验结果与分析(源程序及相关说明)2,八皇后问题:#include <stdio.h>/*声明常量N存储行和列*/#define N 8#define NUM 8/*声明全局变量,h[N][N]控制盘格,H[N][N]控制输出,n[N]存储每一步的*纵坐标,count用于计数。

*/int h[N][N],n[N],H[N][N];int count=0;/*声明函数void tryit(int,int)尝试符合条件的方法*/void tryit(int,int);/*声明函数void outputArray(int[][N])输出数组*/void outputArray(int[][N]);main(){int x=0,y=0,i,j;/*初始化为零*/for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++)h[i][j]=0;}tryit(x,y);printf("//其他的布局略\n");printf("共有%d种布局.\n",92);return(0);}/*定义函数void tryit(int,int)尝试符合条件的方法*/void tryit(int x,int y){int i,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(x>=0&&x<=N-1&&y>=0&&y<=N-1&&h[x][y]==0){/*对与皇后在同一行、列、斜线上的点作出处理*/for(j=0;j<=7;j++){if(h[x][j]==0)h[x][j]=x+1;if(h[j][y]==0)h[j][y]=x+1;if(x+j>=0&&x+j<=N-1&&y+j>=0&&y+j<=N-1&&h[x+j][y+j]==0) h[x+j][y+j]=x+1;if(x+j>=0&&x+j<=N-1&&y-j>=0&&y-j<=N-1&&h[x+j][y-j]==0) h[x+j][y-j]=x+1;if(x-j>=0&&x-j<=N-1&&y+j>=0&&y+j<=N-1&&h[x-j][y+j]==0) h[x-j][y+j]=x+1;if(x-j>=0&&x-j<=N-1&&y-j>=0&&y-j<=N-1&&h[x-j][y-j]==0) h[x-j][y-j]=x+1;}/*对皇后处的点作出标志*/h[x][y]=-x-1;/*完成一种走法作出处理*/if(x==7){/*转换成输出的格式*/for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++){if(h[i][j]<0)H[i][j]=1;elseH[i][j]=0;}}count=count+1;/*输出前几种情况*/if(count<=NUM){printf("------布局%d------\n",count);outputArray(H);}/*对下一种走法,清楚前一次的影响*/for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++){if(h[i][j]==x||h[i][j]==-x||h[i][j]==-x-1)h[i][j]=0;}}/*递归,尝试另一种方法*/tryit(x-1,n[x-1]+1);}/*未走完一次,继续下一行*/else{n[x]=y;tryit(x+1,0);}}else{/*此路不通时,返回上一行,尝试下一种方法*/if(y>7){/*清楚前一次影响*/for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++){if(h[i][j]==x||h[i][j]==-x)h[i][j]=0;}}/*分情况递归*/if(x-1>=0)tryit(x-1,n[x-1]+1);elsetryit(0,0);}/*尝试下一格*/elsetryit(x,y+1);}}}}/*定义函数void outputArray(int[][N])输出数组*/void outputArray(int h[][N]){int i,j;for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++)printf("%d ",h[i][j]);printf("\n");}}运行截图:4.倒水问题:#include"stdio.h"int main(){int ca,cb,cc,x,y;while(scanf("%d%d%d",&ca,&cb,&cc)!=EOF) {if(cb==cc){ printf("fill B\n");}else if(ca==cc){printf("fill A\n");printf("pour A B\n");}else{x=y=0;if(ca<cc){while(1){ if(y==0){y=cb;printf("fill B\n");}if(y>ca-x) //如果b中的水大于a中的剩余容积,就把a灌满//{y-=ca-x;x=ca;printf("pour B A\n");}else //如果b中的水小于a中的剩余容积,那么把b中的水全加入a//{x+=y;y=0;printf("pour B A\n");}if(y==cc) //如果b中的水已经和cc相等,那就结束//{break;}if(ca==x) //如果a中的水满了,就把a倒空//{x=0;printf("empty A\n");}}}else{while(1){if(x==0){x=ca;printf("fill A\n");}if(x>cb-y) //如果a中的水大于b中的剩余容积,就把b灌满//{x-=cb-y;y=cb;printf("pour A B\n");}else //如果a中的水小于b中的剩余容积,那么把a中的水全加入b//{y+=x;x=0;printf("pour A B\n");}if(y==cc)//如果b中的水已经和cc相等,那就结束//{break;}if(y==cb) //如果b中的水满了,就把b倒空//{y=0;printf("empty B\n");}}}}printf("success\n");}return 0;}运行截图:三。

程序设计-第十一届浙江师范大学程序设计竞赛解题报告-精品程序设计资料

程序设计-第十一届浙江师范大学程序设计竞赛解题报告-精品程序设计资料

第十一届浙江师范大学程序设计竞赛解题报告(罗方炜,**************** ,浙师大10计软)比赛概述首先是本届比赛的题目:总共11题本次比赛的提交统计:其中A,B,H,J,K相对简单,C,D,E,I为中等题,F,G为难题,没人解出本次比赛前十名的情况:有一名同学成功解出9道,还有5名同学解出8道,7道的有些数量,恭喜前6名获得本次比赛的一等奖,同时亚洲赛选手前三名,非亚洲赛选手前六名,最佳MM获得奖品——T恤,恭喜十位同学。

本次比赛最终获奖名次在52名,之后的名次同样有解5道的同学,希望他们再接再厉,加强编码功底,下次比赛就能获奖。

同时本次校赛有几名研究生参加,扩大了规模,希望ACM程序设计竞赛在师大越办越好!题目讲解A:排名Time Limit: 10000MS Memory Limit: 65536KTotal Submissions: 233Accepted: 112DescriptionLuofangwei和longpo两个一起参加了ACM比赛,都做出了5道题,根据ACM排名规则,题数一样的情况下,总的罚时越少者获胜。

罚时是这样定义的:做出题的时间加上被罚的时间。

比如A题在14分钟做出来,罚了20分钟,则A题的罚时是34分钟。

现在给你Luofangwei和longpo的做出5题的罚时,请你判断下,谁获胜。

例如Luofangwei 做的5题的罚时是:15 36 84 52 96,那么他的罚时总和为283;longpo做的5题的罚时是:11 22 33 44 55,那么他的罚时总和为165 < 283。

所以,longpo获胜。

如果两个人罚时一样,那就算打平。

Input每个测试数据有两行第一行5个整数,表示Luofangwei做的5道题的罚时第二行5个整数,表示longpo做的5道题的罚时每道题的罚时范围在[ 0 , 300 ] 之间Output如果Luofangwei赢,输出Luofangwei win;如果longpo赢,输出longpo win;打平的话,输出tie。

第一届浙江师范大学C语言程序设计竞赛解题报告

第一届浙江师范大学C语言程序设计竞赛解题报告

第一届浙江师范大学C语言程序设计竞赛解题报告(罗方炜,lfw2565295@126。

com,浙师大10计软)比赛概述首先是本届比赛的题目:本次比赛的提交统计:其中B,F,H相对简单,C,E,G为中等题,A,D为稍难题本次比赛前十名的情况:有两名同学成功解出6道,还有6名同学解出5道,4道的还有些,同时恭喜前5名获得本次比赛的一等奖题目讲解A:欢乐五子棋Time Limit:1000MS Memory Limit:65536KTotal Submissions:8 Accepted: 3Description五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一.发展于日本,流行于欧美。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19×19,棋子放置于棋盘线交叉点上。

两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

Alice和Bob的五子棋游戏和传统的五子棋有一些不一样就是他们使用的棋盘被更改成为9×9。

由于Alice是女生,所以每局比赛都由Alice执黑先走.现在给定一个9×9的棋盘,问下一步走的那个人是否能获胜,你能编程告诉我吗?Input数据的第一行是一个整数N(N<50),表示一共有N组数据;接着是N组测试测试数据;每组测试数据包括9行9列的字符;这9行测试数据中的字符只包括‘b’、‘w’、‘。

’,分别代表黑子,白子和空的;输入数据都是合法数据,就是说(黑子数-白子数)=0或1,以及任何一方到当前步为止都没有取得胜利;输入数据之间用空行隔开(不需要考虑)。

Output如果下一步是Alice走并且能取得胜利,输出“Case x:Alice win!",下一步是Bob 走并且能取得胜利,输出“Case x:Bob win!”,其余情况输出“Case x:Tie”,x表示第x组数据。

程序设计艺术与方法实验报告2

程序设计艺术与方法实验报告2
程序设计艺术与方法课程实验报告实验名称实验四动态规划算法的实现系院专业计算机与信息学院信息安全1002实验日期指导教师一实验目的和要求1
《程序设计艺术与方法》课程实验报告
实验名称
实验四动态规划算法的实现
姓名
孙国友
系院专业
计算机与信息学院
班级
信息安全10-02班
学号
20103061
实验日期
指导教师
成绩
else b[i][m]=1+min(b[i-1][m-1],b[i-1][m],b[i][m-1]); }
cout<<"将a变为b需要"<<b[s2.length()][s1.length()]<< "步!"<<endl;}
void maБайду номын сангаасn() {
string s1,s2;
cout <<"输入字符串a:";
b[0][i]=i;
for(int j=1;j<=s2.length();j++)
b[j][0]=j;
for( i=1;i<=s2.length(); i++)
for(int m=1;m<=s1.length();m++) {
if(tep[i-1]==str[m-1]) b[i][m]=b[i-1][m-1];
一、实验目的和要求
1.理解动态规划的基本思想、动态规划算法的基本步骤
2.掌握动态规划算法实际步骤
二、实验预习内容
1.动态规划算法的基本要素
2.最长公共子序列
3.矩阵连乘问题

Java程序设计解题报告(211006289卢丽娟)

Java程序设计解题报告(211006289卢丽娟)

《Java程序设计》解题报告姓名:卢丽娟班级:软件工程2班学号:211006289内容实验:多线程下载工具一、对多线程的理解多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个想成,彼此间相互独立.线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,由是和所属进程中的其它线程共享一个存储空间,这使得线程之间的通信远较进程简单.多个线程的执行时并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的同时是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们不用关心它,只需要设想各个线程是同时执行即可.二、解题方案与模型工程建在ch15里,多线程下载工具的例程由3个源文件组成,第一个源文件名为J_BusDown.java,这是下载主线程文件;第二个源文件名为J_Dinterface.java,第三个源文件名为J_Down.java这是下载子线程文件。

三、重要程序片段//这是下载主线程文件BusDown.javaimport java.io.IOException;//…public class J_BusDown implements Runnable{ // …public J_BusDown(String url,String savaPath,JTextArea JT,int i,JProgressBar js)throws IOException{// … }//得到文件程度public long getSize(){int fileLength=-1;try{// …} catch (Exception ex){ex.printStackTrace();}return fileLength;}//主线程public void run(){// …}//第二个源文件:import java.awt.BorderLayout;import java.awt.FileDialog;//…import javax.swing.*;public class J_Dinterface extends JFrame{// …public J_Dinterface(){super("多线程下载器");// …}private void JButtonActione(ActionEvent e){// …}public static void main(String[] args) {// …}}//这是下载子线程文件Down.javaimport javax.swing.*;//…import .*;public class J_Down implements Runnable{// …public J_Down(String url,String save,long start,long ends,int i,JTextArea jt,JProgressBar js,long s) throws IOException {// …}public void run(){// …}}四、测试样例与结果在已知的下载地址下,将文件另存,开始下载后在空白的显示区就可以看到下载的情况五、分析讨论这是个多线程下载工具,主要包括下载主线程文件BusDown.java和下载子线程文件Down.java 以及 J_Dinterface.java。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计方法与艺术实验报告
班级:0001班
指导老师:徐本柱
组长:2015211727 张家铭组员:2015211739
2015211744
2015211753
题目A旅行路线的数目
一个正方形的小镇被分成N2个小方格,Betsy要从左上角的方格到达左下角的方格,并且经过每个方格恰好一次。

编程对于给定的N,计算出Betsy能采用的所有的旅行路线的数目
解题思路:
这道题目很明显是道搜索题,关键在于优化。

而搜索题的优化主要就是剪枝。

首先很容易想到,因为Betsy是任意的走,当n取到5或6时,它的方案总数就已经很大了,方案数越是大,搜索时,不要用的枝就会越多,而且这些枝占方案总数的比例相当大。

如果能知道什么情况下,会出现必然无解,就能很好的提高效率了。

于是由此知道,此题用剪枝的方法做是正确的。

具体解法:
首先从题目的条件入手,题目要求每一个各自都必须走到,而且每一个格子只能走一遍。

这两个条件就指出了这道题目的可剪的枝条中的两个。

然后从这两条出发,仔细分析一下,到底在什么情况下会不满足题目的要求。

第二个条件要求每个格子只能走一遍,这很简单,用一个数组记录一下到底有哪些格子是已经经过了的,那些是还没有经过的,在Betsy移动时,就只移动到那些还没有经过的格子中去,这样就避免了一个格子走两遍。

第一个条件要求每个格子都要经过一次,这是个很难满足的条件,有很多无解的情况就是因为不满足它,那到底有哪些情况会导致不满足着一个条件呢。

比方说下面的几个图。

图中箭头表示Betsy的行走路线。

如图1,其中的黄色区是不能达到的,如果到
达了黄色区,就别再想到最左下角了,因为,
这个区域只有一个入口,没有出口,进得去,
出不来。

于是,就一般的情况来说,每一个还
没有到过得格子(除开终点)都必须要有两个
空格子与之相连接(Betsy当前所在的格子算是
个空格子),这样才能保证Betsy既可以移进这
个格子又可以移出这个格子。

图1
再如图2,其中的红色格子是不可能达到了,
虽然它满足每一个格子都有两个相邻的空格
子,但是,Betsy是不可能移动到这些红格子中
去了,这几个格子被隔断了。

一般化,Betsy行
走的路径不能够圈出一个独立的块出来,否则
这一块是没有办法走到的。

图2
图2中的独立的一块要如何判断,难道要进行一次搜索求得?不。

看一下的几种情况,仅当出现这几种情况时,会分割出一个独立的块。

图中绿色格子表示Betsy现在所在的格子,黑色格子表示Betsy已经走过的格子,空格子是没有经过的格子。

仅当Betsy沿箭头方向移动时会分割出两块相对独立的块,Betsy只能到达其中的一块,而另一块是不可能到达的,于是这种情况不满足条件二,应当予以排除。

当然,还有一种情况,如果想到了,程序速度可以加快很多,就是,最左下角的格子必须是最后走,如果还没把所有的格子都走到就到了终点是不合要求的。

有了这三条剪枝,速度就可以猛增了。

下面进行一下对比。

数据n 答案没有用任何剪枝的程序耗时用了三种剪枝的程序耗时
1 1 0 s 0 s
2 1 0 s 0 s
3 2 0 s 0 s
4 8 0 s 0 s
5 48 0 s 0 s
6 1770 3.72 s 0 s
7 88418 〉30 min 0.83 s
其实这个题目还有其它的剪枝,但是对于这些数据,不能取得很明显的效果,就不与介绍,但是如果要计算更大的数据,还是有枝可剪的。

代码实现:
#include <iostream>
#include <String>
#include <stdlib.h>
using namespace std;
int main()
{
string num;
long f[20][20]={},max,t;
int k;
while(cin>>num){
cin>>k;
for(int i=0;i<num.length();i++)
{
f[i][0]=atoi(num.substr(0,i+1).c_str());
}
for(int m=1;m<k;m++)
for(int j=0;j<num.length();j++)
{
max=0;
for(int x=0;x<j;x++)
{
if((t=f[x][m-1]*atoi(num.substr(x+1,j-x).c_str()))>max)
{
max=t;
}
}
f[j][m]=max;
}
cout<<f[num.length()-1][k-1]<<endl;
}
return 0;
}
运行结果:
题目B 。

(注:类似题目A,后面题目相同,本报告每个小组交一份)。

相关文档
最新文档