- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
综合编程实验报告(完美的代价).
“程序设计II”综合编程实验报告
( 2011 - 2012 学年第 二 学期)
实验项目名称: 完美的代价
学生姓名: 曾棪 专业班级: 统计1101 学号:
实验成绩:
一、实验内容与要求
回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的有人认为回文串是一种完美的字符串。现在给你一个字符串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置例如所给的字符串为”mamad”,第一次交换ad,得到”mamda”第二次交换md,得到”madma”;第三次交换m和a,得到”madam”程序从键盘读入数据。第一行是一个整数N(N = 0),表示所给字符串的长度,第二行是所给的字符串,长度为N且只包含小写英文字母。如果所给字符串能经过若干次交换变成回文串,则输出所需的最少交换次数;否则,输出Impossible。Impossible
显然可以看出来aaabb可以形成回文但程序判断不可以形成回文。因此针对错误输出的个例进行解题示例程序算法的修改。
针对原思路进行思考后,发现原程序对不能形成回文的字符串判断并不完整可靠。
因此在第一次对不能形成回文的字符串的判断后再进行第二次判断。加入算法如下:
if(flagtime==0){
i--;
reverse(p,N);
continue
}
其中自定义函数reverse的功能是讲输入字符串逆序返回,具体算法为:
void reverse(char *p,int N)
{
char *pj,t;
for(pj=p+N-1;ppj;p++,pj--){
t=*p;
*p=*pj;
*pj=t;
}
time=1;
}
对修改之后编译连接通过的程序进行之前的错误输出的测试数据进行测试:
测试用例:
输入:5 aaabb
输出:3
测试通过。可见程序改进成功。
三、方案设计
1、解题思路
1.如何判断字符串是否可以形成回文。
2.若可以形成回文则如何以最少步数进行邻位交换形成回文。
针对第一个问题对一些可以看出能形成回文的字符串的进行讨论,
发现奇数个数字符的字符串和偶数个数字符的字符串对于判断是否形成回文各有特点。如:
aaabb
ababc
可以发现:奇数个数字符的字符串的各字符只有一个字符的相同个数为奇数,其余字符的相同个数均为偶数。
而如aaabbb aabbcc等偶数个数字符的字符串的所有字符的相同个均为偶数。
因此,初步形成对奇数个数字符的字符串和偶数个数字符的字符串分别判断是否可以形成回文的思路。
考虑之下认为该思路下算法比较复杂从而希望可以寻找简单易行的思路。
思考可不可以避开对字符串字符个数的奇偶性的讨论。
最后发现可以先不对字符串进行是否可以形成回文的判断,而是直接对字符串进行形成回文的交换,在交换的过程中进行对是否可以形成回文的判断,从而避开对字符串进行先判断再形成,大大减少了算法的复杂程度。
现在面对的问题只有一个:怎样形成回文。采用对字符串进行两端向中间的回文形成逼近的方法。具体步骤为:
1.先将字符串一端的一个字符固定;
2.再从字符串另一端开始遍历,寻找与固定字符第一个相同字符的位置;
3.找到第一个相同字符后,然后进行邻位交换将找到的字符移到与固定的字符相对应的位置上,并累计步数;
5.若找不到相同字符,则判断原字符串无法形成回文;
4.然后固定之前固定字符的下一个字符,重复上面的步骤,直到形成回文为止;
程序编译之后发现出现错误示例,针对错误示例对初步形成的程序进行改进。详见之前的错误处理。
2、数据结构描述
定义字符类型的一维字符数组用以保存字符串。
定义flag判断是否找到了相同字符。
定义time判断找为了寻找相同字符改变方向的次数。
定义全局变量step累计形成回文的步数。
3、程序框架结构
定义字符类型的一维字符数组s[80]用以保存字符串。
设计三个自定义函数:
int ismirror(char *p,int N); /*判断是否为回文*/
int countstep(char *p, int N); /*判断原字符串是否可以形成回文,若是则计算形成回文的最少步数*/
void reverse(char *p,int N); /*将字符串逆序返回,相当于改变遍历方向*/
4、关键算法描述
判断原字符串是否可以形成回文,若是则计算形成回文的最少步数
int countst
文档评论(0)