习题3-11 换抵挡装置 UVa1588
感悟。
1、上网站下载英文原题,仔细阅读。
2、持续的移动咬合想不清时,可以考虑分段的移动咬合,等能力强劲后可以考虑是否能一次性解决。
3、移动的长条选小的,不动的选长度长的长条,左边右边都添加小的长条空间。
4、思路比较简单,但编写比较困难,尤其是分段函数接壤部分的处理。
5、找分段函数的通式上费了老鼻子劲,最后还是靠采用121 12 ==》0012100 12 现场掰手指头的方式来找数学公式,效果还不错 。
6、提交又一次就AC啦,此类程序难在通过测试样例。
7、对整型逻辑变量,若要设置时设置为0,还是1呢,实践证明,真的时候设置1比0管用,真的时候设置0容易造成逻辑混乱。
8、至此第三章编码结束,很高兴,虽然书本进度推进到60页,但水平真是长进了不少啊。同样是学1+1=2,认识得更加的深入。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
char smin[1000];
char smax[1000];
char stemp[1000];
int book[1000];
int main(){
int sminlen,smaxlen,tlen;
int i,j;
while(scanf("%s%s",smin,smax)!=EOF){
sminlen=strlen(smin);
smaxlen=strlen(smax);
if(sminlen>smaxlen){//交换,处理成真正的smin,smax;
tlen=sminlen;
sminlen=smaxlen;
smaxlen=tlen;
strcpy(stemp,smin);
strcpy(smin,smax);
strcpy(smax,stemp);
}
for(i=0;i<sminlen;i++){//左边sminlen长度的字符'0'串
stemp[i]='0';
}
for(i=sminlen;i<sminlen+smaxlen;i++){//中间,串smax
stemp[i]=smax[i-sminlen];//注意smax[i-sminlen]容易写错
}
for(i=sminlen+smaxlen;i<sminlen+smaxlen+sminlen;i++){//右边sminlen长度的字符'0'串
stemp[i]='0';
}
stemp[sminlen+smaxlen+sminlen]='\0';//字符串结束标志
memset(book,0,sizeof(book));//全都不成功
//扫描这段是分段函数,很昏,采用121 12 ==》0012100 12 现场掰手指头的方式来找数学公式,效果还不错
for(i=0;i<=sminlen-1;i++){//smin在左侧移动,未被smax完全遮挡
for(j=0;j<sminlen;j++){
if(stemp[i+j]-'0'+smin[j]-'0'==4){//咬合不成功
break;
}
}
if(j==sminlen)//成功book[i]=1; j==sminlen而不是j=sminlen奇怪,怎么这么容易写错
book[sminlen+smaxlen-1-i]=1;
}
for(i=sminlen;i<=smaxlen;i++){//smin在中间移动,完全被smax遮挡
for(j=0;j<sminlen;j++){
if(stemp[i+j]-'0'+smin[j]-'0'==4){//咬合不成功
break;
}
}
if(j==sminlen){//之前竟然将==写成=
book[smaxlen-1]=1;
}
}
for(i=smaxlen+1;i<=sminlen+smaxlen;i++){//smin在右侧移动,未被smax完全遮挡
for(j=0;j<sminlen;j++){
if(stemp[i+j]-'0'+smin[j]-'0'==4){//咬合不成功
break;
}
}
if(j==sminlen)
book[smaxlen+i-smaxlen-1]=1;
}
for(i=smaxlen-1;i<sminlen+smaxlen;i++){//打印总长度,注意i的起始位置不是0而是smaxlen-1
if(book[i]==1){
printf("%d\n",i+1);
break;
}
}
}
return 0;
}