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

合集下载

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。

C语言兴趣小组练习题解题报告

C语言兴趣小组练习题解题报告

C语言兴趣小组练习题解题报告附录这里是我个人的一些看法,希望能有所作用。

需要说明的是解题报告上有很多源代码写的不好(题目自带的,我写的可以提供电子版,不通过书面给出了),具体自己注意斟酌。

第一、二两道题看解题报告就可以了,算法没有什么可以改进的了,只是程序的优秀性了。

第三题的程序很简单,注意后面在计算平均分的时候如果要保留小数位数就不能直接int/int了。

感觉解题报告的程序有点烦琐,有兴趣的可以看看我写的代码。

第四题的思路就像解题报告上的,不过推荐用while循环语句搞定(简单)。

第五题参照解题报告。

第六题就是三个for循环语句,注意判断条件。

第七题解题报告提供的程序包含了大家常用的两种方法,一是从31到99去是平方数,另一个是对前两位和后两位进行循环选择。

注意使用sqrt要包含math.h这个头文件。

第八至第十一我没有细看,不给出建议和程序了。

第十二题是很简单的一个题目,注意每一位数是怎么抠出来的就行了。

第十三题就是不停的试a的值就可以了,条件很好判断。

第十四题解题报告给出的思路很好,推荐……。

第十五题思路如解题报告。

第十六大题没有什么特别的地方,注意控制语句的使用就可以了,需要注意的是应该养成好的编程风格,行用j控制,列用i控制。

第十七题简单,本来准备要求格式的,注意控制输入输出的参数(%d,%2d,%-2d……)。

第十八题的解法是挨个字符读入,弄一个计数器,读到‘(’的时候加一,‘)’的时候减一,中间只要计数器出现负数马上跳出,否则到读完后根据计数器的正负情况输出结果。

第十九题只有穷举所有可能的情况,然后判断是否符合条件。

源代码没写 ,最终结果是E D A C B。

第二十题可以通过很笨的方法实现,比较好的方法是不停的取余。

课本上有介绍,也可以看看我的代码。

需要补充的是希望大家养成一个好的编程风格,具体可以参照课本(虽然我觉得不是非常好)。

C语言兴趣小组练习题解题报告

C语言兴趣小组练习题解题报告

C语言兴趣小组练习题解题报告1.绘制余弦曲线在屏幕上用* 显示0~360度的余弦函数COS(x)曲线。

问题分析与算法设计如果在程序中使用数组,这个问题十分简单。

但若规定不能使用数组,问题就变得不容易了。

关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。

为了获得本文要求的图形就必须在一行中一次输出两个“*”。

为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。

将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。

程序中利用反余弦函数acos计算坐标(x,y)的对应关系。

使用这种方法编出的程序短小精炼,体现了一定的技巧。

程序说明与注释#include<stdio.h>#include<math.h>void main(){double y;int x,m;for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/{m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/for(x=1;x<m;x++) printf(" ");printf("*"); /*控制打印左侧的* 号*/for(;x<62-m;x++)printf(" ");printf("*\n"); /*控制打印同一行中对称的右侧*号*/}}2.绘制圆在屏幕上用* 画一个空心的圆。

问题分析与算法设计打印圆可利用图形的左右对称性。

根据圆的方程:R*R=X*X+Y*Y可以算出圆上每一点行和列的对应关系。

合工大程序设计艺术与方法实验一

合工大程序设计艺术与方法实验一

《程序设计艺术与方法》课程实验报告#include<list>#include<algorithm>using namespace std;bool comper(int a, int b){return (a > b);}//vector练习void OUTV(vector<int> v){vector<int>::iterator it = v.begin();for (; it != v.end(); ++it){cout << (*it) << " ";}cout << endl;}void FindV(vector<int> &exp){int x;vector<int>::iterator L;cout << "请输入你要查找的数:" << endl;cin >> x;L = find(exp.begin(), exp.end(), x);if (L != exp.end()){cout << "查找成功!" << endl;cout << "该数为:" << *L << endl;}else{cout << "无该数!" << endl;exp.push_back(x);cout << "输出结果:";OUTV(exp);}}void SortV(vector<int> &exp){cout << "升序:" << endl;sort(exp.begin(), exp.end());OUTV(exp);cout << "降序" << endl;sort(exp.begin(), exp.end(),comper);OUTV(exp);}void DeldetV(vector<int> &exp){cout << "删除最后一个元素" << endl;exp.pop_back();OUTV(exp);}void V(){vector<int> exp1;srand((int)time(0));cout << "vector练习:" << endl;for (int i = 0; i < 10; i++)exp1.push_back(rand());//插入10个随机数OUTV(exp1);exp1.insert(exp1.begin(), rand());OUTV(exp1);FindV(exp1);SortV(exp1);DeldetV(exp1);cout << "最大值:" << exp1[0] << endl;cout << "最小值:" << exp1[exp1.size()-1] << endl;exp1.clear();//清空迭代器}//List练习void OUTL(list<int> v){list<int>::iterator it = v.begin();for (; it != v.end(); ++it){cout << (*it) << " ";}cout << endl;}void FindL(list<int> &exp){int x;list<int>::iterator L;cout << "请输入你要查找的数:" << endl;cin >> x;L = find(exp.begin(), exp.end(), x);if (L != exp.end()){cout << "查找成功!" << endl;cout << "该数为:" << *L << endl;}else{cout << "无该数!" << endl;exp.push_back(x);cout << "输出结果:";OUTL(exp);}}void SortL(list<int> &exp){cout << "排序:" << endl;exp.sort();OUTL(exp);}void DeldetL(list<int> &exp){cout << "删除最后一个元素" << endl;exp.pop_back();OUTL(exp);}void L(){list<int> exp2;srand((int)time(0));cout << "List练习:" << endl;for (int i = 0; i < 10; i++)exp2.push_back(rand());//插入10个随机数OUTL(exp2);exp2.push_front(rand());OUTL(exp2);FindL(exp2);SortL(exp2);DeldetL(exp2);//清空迭代器exp2.clear();}int_tmain(int argc, _TCHAR* argv[]){V();L();system("pause");。

课程设计小组报告模板

课程设计小组报告模板
优及格及格及格不及格不及格不及格201320132013年年年060606月月南京工业大学南京工业大学南京工业大学201320132013网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告第一部分第一部分第一部分小组分工及分工计划小组分工及分工计划小组分工及分工计划宋体小四宋体小四宋体小四号151515南京工业大学南京工业大学南京工业大学201320132013网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告第二部分第二部分第二部分小组调研方案设计小组调研方案设计小组调研方案设计访问者分析访问者分析访问者分析调研方案设计请根据调研实施的要求书写调研方案设计请根据调研实施的要求书写调研方案设计请根据调研实施的要求书写调研数据分析调研数据分析调研数据分析宋体四号宋体四号宋体四号151515倍行距倍行距倍行距宋体小四宋体小四宋体小四号151515宋体小四宋体小四宋体小四号151515南京工业大学南京工业大学南京工业大学201320132013网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告网站设计与管理课程设计小组工作报告第三部分第三部分第三部分信管专业网站博客设计及推广方案信管专业网站博客设计及推广方案信管专业网站博客设计及推广方案标杆网站分析标杆网站分析标杆网站分析网站博客设计说明网站博客设计说明网站博客设计说明请配截图请配截图请配截图三网站博客推广说明请配截图三网站博客推广说明请配截图三网站博客推广说明请配截图宋体四号宋体四号宋体四号151515倍行距倍行距倍行距宋体小四宋体小四宋体小四号151515宋体小四宋体小四宋体小四号151515
南京工业大学
网站设计与管理
课程设计报告
小组工作报告

《程序设计》实验报告

《程序设计》实验报告

《程序设计》实验报告实验报告:程序设计摘要:本实验是关于程序设计的实践,通过实验探讨了程序设计的基本概念、基本方法和基本技巧。

实验过程中,学生需要自主选择并解决具体问题,从而学习和理解程序设计的过程和思想。

1.引言程序设计是计算机科学和工程的重要组成部分,是指根据特定需求编写计算机程序的过程。

这个过程包括定义问题、设计算法、编写程序、测试和调试程序等。

程序设计既是一种艺术,也是一种科学,需要程序员具备一定的逻辑思维能力和编程经验。

2.实验目的本次实验的目的是通过实践掌握程序设计的基本概念、基本方法和基本技巧。

具体来说,实验要求学生选择一个具体问题,然后根据问题的需求设计并编写出解决问题的程序。

3.实验内容3.1选择问题:首先,学生需要选择一个具体的问题进行解决。

这个问题可以是实际生活中遇到的问题,也可以是抽象的数学问题等。

3.2设计算法:针对所选择的问题,学生需要设计一个合适的算法。

算法是解决问题的思路和步骤的描述,通常通过伪代码或流程图表示。

3.3编写程序:根据设计的算法,学生需要用合适的编程语言编写程序,并且确保程序在运行时能够正确、高效地解决问题。

3.4测试和调试:完成编写程序后,学生需要进行测试和调试,以确保程序的正确性和稳定性。

测试可以包括输入输出的验证、负载测试等。

4.实验结果与分析本次实验中,我选择了一个简单的问题进行解决:计算一个整数序列中的最大值。

针对这个问题,我设计了一个简单的算法:遍历序列,依次比较当前元素和已记录的最大值,更新最大值。

我用C++语言编写了解决问题的程序,并进行了测试。

测试结果表明,我的程序能够正确地计算出给定序列的最大值。

通过本次实验,我对程序设计的基本概念、基本方法和基本技巧有了更深入的理解。

我学会了如何选择问题、设计算法和编写程序,以及如何进行测试和调试。

这些都是程序设计中必不可少的一部分,对我今后的学习和工作都具有重要意义。

5.实验总结本次实验是一次很好的学习机会。

程序设计研讨小组报告

程序设计研讨小组报告

程序设计研讨小组报告一、小组成员四区队全体成员二、任务分工区队长进行指派分工十三班:代码,报告十四班:调试十五班:代码,算法,ppt三、小组选题在本次研讨活动中,我们小组的研讨内容为计算器的设计与实现1.分析题目:参照windows中计算器的功能,实现简易计算器的计算,四则运算,开方,正负的互换。

2.任务分工:区队长针对三个班的特点,制定以下分工十三班:整合代码及信息制作ppt十四班:调试代码,界面优化十五班:开方运算,正负号互换运算,小数点,退格等代码,编写四则运算的代码3.代码编写:Dim s$, s0$, opt$ 's0-前一个数 s-当前数 opt-运算符Private Sub Command1_Click(Index As Integer) '数字If s = "" ThenIf Index > 0 Thens = IndexEnd IfElses = s & IndexEnd IfDisplay sEnd SubPrivate Sub Command2_Click(Index As Integer) '运算符 Dim x As DoubleIf opt = "" Thenopt = Command2(Index).Captions0 = ss = ""Exit SubEnd IfIf Command2(Index).Caption = "=" Thens = Label1.CaptionEnd IfSelect Case optCase "+"x = Val(s0) + Val(s)Case "-"x = Val(s0) - Val(s)Case "*"x = Val(s0) * Val(s)Case "/"If Val(s) = 0 ThenElsex = Val(s0) / Val(s)End IfCase ElseEnd Selects0 = Str(x)If Command2(Index).Caption <> "=" Thenopt = Command2(Index).Captions = ""End IfDisplay s0End SubPrivate Sub Command3_Click() '小数点If InStr(s, ".") < 1 ThenIf s = "" Thens = "0."Elses = s & "."End IfDisplay sEnd IfEnd SubPrivate Sub Command4_Click() '正负号If Val(s) <> 0 ThenIf Left(s, 1) = "-" Thens = Mid(s, 2)Elses = "-" & sEnd IfDisplay sEnd IfEnd SubPrivate Sub Command5_Click() '清除s0 = ""s = ""opt = ""Display sEnd SubPrivate Sub Form_Load() '初始化Const s2 = "+-*/="For i = 0 To 9Command1(i).Caption = iNext iFor i = 0 To 4Command2(i).Caption = Mid(s2, i + 1, 1) Next iEnd SubSub Display(s As String) '显示If Val(s) = 0 ThenLabel1 = "0. "ElseIf InStr(s, ".") < 1 ThenLabel1 = s & ". "ElseLabel1 = s & " "End IfEnd Sub四、自我评价与总结。

第五届大学生程序设计竞赛解题报告

第五届大学生程序设计竞赛解题报告

牲口棚的安全
Description 农夫为他的牲口棚安装了一套新的安全系统。现 在需要为牛群中的每头母牛设定一个有效的秘密。 一个有效的密码由L(3 <= L <= 15)个不同的小 写字母组成(即为传统的拉丁字符’a’…’z’), 其中至少包含一个元音字母('a', 'e', 'i', 'o', 或'u') 和至少两个辅音字母(非元音字母),而且字母 必须按字母表顺序排列(如:'abc' 是有效密码; 'bac' 是无效密码)。
同学们发现新宿舍只有一个插座但他们有很多同学们发现新宿舍只有台电脑需要同时使用于是他们买来了好几个排插每个排插可支持的插头不一样多你的任务是帮他们计算一下他们的排插能支持多少台电脑同时使用
第五届校赛
PK赛
Description 一年一度的厦门理工学院程序设计大赛又开始了,今年是 第五届。今年赛会组织方决定用一种新规则决定获胜的选 手。在每一轮比赛中,参赛者都是成对的,两两比赛。输 者将被淘汰,赢者将自动晋级到下一轮比赛中。比赛一直 进行到只剩一个人为止,这个人就是冠军。 在一轮比赛中,如果比赛人数不是偶数,那么将随机选择 一个参赛者自动晋级下一轮,而其它人还是一对一地完成 本轮比赛。赛会组织方想知道要产生冠军需要进行多少轮 比赛。
Input 输入数据第一行是一个整数N( 1 <= N < 100 ),代表烤 鸭的总数,接下来的一行中有三个整数X、Y和Z,他们之 间用一个空格隔开,他们代表这些烤鸭的原始价格¥ _XYZ_。 Output 测试数据可能不止一种价格方案,也可能没有一种价格方 案。对于后一种情况输出0;如果不止一种价格方案,输 出对应单只烤鸭最贵的褪色数字和单只烤鸭的价格,以空 格作为间把N根木棒还原为一根并且每 次只能将两根进行连接,所花费的时间是两根木 棒的长度和,要求还原为一根木棒且总时间最短。

程序设计报告

程序设计报告

程序设计报告篇一:程序设计报告要求每个小组做全本套题目时限:1s【题目描述】有一个字符集合,它只包含a-z这26个小写字母。

根据集合的定义,集合的容量是集合含有不同元素的个数。

由于该集合中包含了非常多的重复字母,因此让你编程计算下该集合的容量,也就是该集合包含了多少不相同的字母。

【输入】有多组样例。

第一行为样例的个数T。

接下来T行,每一行代表一个样例。

这一行为一个字符串,表示一个集合。

规定以’{’开头,以’}’结束。

每个字符用’,’给开,逗号与逗号后的元素空出一个空格。

【输出】每个集合的容量。

一个样例占一行。

【输入样例】2{a, b, c}{a, b, a, b}【输出样例】32B吉利数字时限:1s【题目描述】算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,那么称它为吉利数。

现在叫你计算某个区间内有多少个吉利数字。

【输入】第一行为样例个数N。

接下来N行,每一行代表一个输入样例,每个输入样例有2个数,分别代表某个区间的起点a和终点b。

注意所求区间为[a,b],1 =a =b =10【输出】N行。

对于第x个输入样例,在第x行输入该样例所对应的结果。

【输入样例】21 101 20【输出样例】1【Hint】1-10之内无幸运数,1-20内只有19 这1个幸运数C炸弹袭击时限:1s【题目描述】H族的领地是一片富饶之地,有丰富的资源,无数的黄金。

尽管异族侵略者被压制几百多年,他们并没有放弃对这片土地的渴望。

最近,他们研制了一枚重磅炸弹。

试图用它摧毁H族的防御工事。

H族的防御工事由多个基地构成,侵略者试图用炸弹摧毁尽量多的防御基地,现在,他们急需你的帮助。

如果你能为他们解决难题,会有巨大的奖励。

〔该炸弹的攻击范围是一个半径为r单位的圆〕【输入】第一行为样例的个数T。

每个样例中有假设干行,第一行为炸弹的攻击半径r,r有可能不是整数(1 =r =100)第二行是一个整数n,表示H族防御基地的个数(1 =n =100)接下来n行,每行有两个数,代表H族某个防御基地的坐标【输出】只有一个数,代表炸弹能最多摧毁的H族防御基地数量。

程序与设计实验报告模板

程序与设计实验报告模板

程序与设计实验报告模板1. 实验目的本实验旨在通过设计一个程序来实现某项功能,并对程序进行测试和分析,从而提高学生的程序设计能力和解决问题的能力。

2. 实验内容本次实验的任务是设计一个学生信息管理系统,要求实现以下功能:- 添加学生信息:包括学号、姓名、性别、年龄等字段。

- 修改学生信息:根据学号进行修改,可以修改学生的任意字段。

- 查询学生信息:根据学号或姓名进行查询,输出学生的所有信息。

- 删除学生信息:根据学号进行删除。

3. 实验过程3.1 程序设计为了实现上述功能,我采用了面向对象的编程思想,将学生信息封装为一个类,可以通过该类来创建学生对象,并对学生对象进行相应的操作。

首先,我创建了一个`Student`类,该类包括学号、姓名、性别、年龄等字段,并提供了相应的setter和getter方法。

接着,我创建了一个`StudentDatabase`类,该类用于存储学生信息,并提供了添加、修改、查询、删除等功能的方法。

在该类中,我使用了一个字典来存储学生信息,学号作为键,学生对象作为值。

最后,我编写了一个测试程序,可以通过用户输入来调用相应的方法,从而进行学生信息的管理。

3.2 程序测试为了验证程序的正确性和稳定性,我进行了一系列的测试。

首先,我添加了若干个学生信息,并进行查询和修改操作,确保学生信息的准确性和可修改性。

接着,我删除了一个学生信息,并进行查询操作,确认该学生信息已被成功删除。

最后,我对程序进行了异常测试,例如输入不存在的学号或姓名,程序能够正确处理并给出相应的提示。

3.3 实验总结通过本次实验,我加深了对程序设计的理解和实践,掌握了面向对象的编程思想,并且提高了解决问题的能力。

4. 实验结果经过测试,程序能够正确实现学生信息的添加、查询、修改和删除功能,并且能够正确处理异常情况。

5. 实验反思在实验过程中,我遇到了一些问题,例如学生信息的输入是否合法、数据的存储方式等。

通过查阅相关资料和与同学的讨论,我解决了这些问题,并且不断改进了程序的设计和实现。

程序设计艺术与方法课程设计报告 (3)

程序设计艺术与方法课程设计报告 (3)

ICPC综合培训解题报告组长:孙长中组员:徐麟,郝旭,姜敬超,仲洋A First BloodTime Limit: 3000/1000 MS (Java/Others)问题描述盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:老师给了一个正整数n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。

盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?输入首先是一个正整数T,表示有T组测试数据每组测试数据是一个正整数n(1<=n<=10^6)输出对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行样例输入297样例输出504210注意事项数据范围超出32位整数,可用long long或__int64表示64位整数解题思路:求三个数的最大的最小公倍数最好是要求三个数尽可能大且互质,当我们给出一个数,要求从比这个数小的数中找3个数的最小公倍数时,当这个数N是奇数时,可以证明,N,N-1,N-2是互质的,且这三个数是最大的,当这个数N是偶数时,我们分情况讨论,N是不是3的倍数,如果是,N-1,N-2,N-3是最大且互质的,不是时,N,N-1,N-3是最大且互质的。

代码:#include<iostream>using namespace std;int odd(int n){return n*(n-1)*(n-2);}int even_num_not3(int n){return n*(n-1)*(n-3);}int even_num_3(int n){return (n-1)*(n-2)*(n-3);}int main(){int n;cin>>n;int a[n];for(int i=0;i<n;i++){int x;cin>>x;a[i]=x;}for(int i=0;i<n;i++){if(a[i]%2==1)cout<<odd(a[i])<<endl;else if (a[i]%2==0&&a[i]%3==0)cout<<even_num_3(a[i])<<endl;elsecout<<even_num_not3(a[i])<<endl;}return 0;}运行结果:B 求和Time Limit: 3000/1000 MS (Java/Others)问题描述对于正整数n,k ,我们定义这样一个函数f ,它满足如下规律...87654321)4,(...654321)3,(...654321)2,(...654321)1,(+++++----==++++---==+--++--==++-+-+-==k n f kn f kn f kn f 现在给出n 和k ,你的任务就是要计算),(k n f 的值。

程序设计艺术与方法课程设计报告 (4)

程序设计艺术与方法课程设计报告 (4)

解题报告小组成员:王宇昆2013211697 张欣天2013211689孙浩2013211703张荣俊2013211714江浩2013211703班级:计算机科学与技术13-3班A First BloodTime Limit: 3000/1000 MS (Java/Others)问题描述盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:老师给了一个正整数n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。

盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?输入首先是一个正整数T,表示有T组测试数据每组测试数据是一个正整数n(1<=n<=10^6)输出对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行样例输入297样例输出504210注意事项数据范围超出32位整数,可用long long或__int64表示64位整数1.思路对于这个问题,有两种情况。

解决问题需分以下几种情况分别讨论I.最大数是奇数n,则最大的最小公倍数是(n-1)*(n-2)*nII.最大数是偶数n,若n,n-3和n-1和n-3最小公约数都为1,则最大的最小公倍数为n*(n-1)*(n-3),否则为(n-1)*(n-2)*(n-3)2.代码#include<iostream>using namespace std;#define LL long longLL yue(LL a,LL b) //最小公约数{if(b==0){return a;}int c=(a>b?b:a);int n;for(n=1;n<=c;n++){if(a%n==0&&b%n==0){return n;}else{continue;}}}LL bei(LL a,LL b) //最大公倍数{return a*b/yue(a,b);}int main(){int T;cin>>T;while(T--){LL n;LL a;cin>>n;if(n==1){cout<<1<<endl;}if(n==2){cout<<2<<endl;}if(n%2!=0){cout<<n*(n-1)*(n-2)<<endl;}if(n%2==0){if(yue(n,n-3)==1&&yue(n-1,n-3)==1){a=bei(n,bei(n-1,n-3));}else{a=bei(n-1,bei(n-2,n-3));}cout<<a<<endl;}}return 0;}2.运行结果B 求和Time Limit: 3000/1000 MS (Java/Others) 问题描述对于正整数n,k,我们定义这样一个函数f,它满足如下规律...87654321)4,(...654321)3,(...654321)2,(...654321)1,(+++++----==++++---==+--++--==++-+-+-==k n f kn f kn f kn f 现在给出n 和k ,你的任务就是要计算),(k n f 的值。

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

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

《程序设计艺术与方法》课程实验报告《程序设计艺术与方法》课程实验报告一2 练习泛型算法的使用:#include<list>#include<iostream>//#inclued<algorithm>using namespace std;typedef list<int> lin;int value[]={2,4,6,1,8};void print(lin &l){int i;lin::iterator lit;//定义一个迭代器for(lit=l.begin();lit!=l.end();lit++)cout<<(*lit)<<" ";//打印list中的元素cout<<endl;}bool sortsp(int v1,int v2)//升序排序算法{二实验搜索算法的实验姓名系院专业信息工程班级物联网一学号实验指导成一、实验目的和要求1.掌握宽度优先搜索算法。

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

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

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

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

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

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

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

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

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

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

上机运行并检验结果。

  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,后面题目相同,本报告每个小组交一份)。

相关文档
最新文档