习题3-11 换抵挡装置 UVa1588

来源:互联网 发布:怎么创建数据库sql语句 编辑:程序博客网 时间:2024/06/15 18:02
算法竞赛入门经典(第2版)第3章 数组和字符串
习题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;
}

0 0
原创粉丝点击