首页 > 代码库 > 算法练习(一)

算法练习(一)

     昨天是个值得纪念的日子,我数学建模拿了推荐国家一等奖的名额,希望最后能顺利拿到国一吧。现在大三已经开学一个月了。这一个月因为社会实践评优的事情真的很忙,还好最后拿到了可能拿到的所有的奖项。结果自己把科研助手这件事给耽误了,今天去找马老师,结果马老师的实验室人已经满了。所以没办法,我可能又要去找其他老师了。

  今年国家奖学金的名额里面没有我,没有就算了吧。卧薪尝胆,好好学习,这一学期至关重要。所以自己现在就要开始准备保研的机试,现在的训练非常重要,无论如何,这是自己未来要走的一步路。我现在最重要的就是六级、学习、机试、科研,这四个缺一不可。加油加油!所以今天是C语言算法的基础部分:自顶向下的编程方法。

1.UVa1339古老的密码

#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int cnt1[26],cnt2[26];char s1[110],s2[110];int main(){    while(scanf("%s%s",s1,s2)==2){        int len1 = strlen(s1);        int len2 = strlen(s2);        memset(cnt1,0,sizeof(cnt1));        memset(cnt2,0,sizeof(cnt2));        for(int i = 0;i<len1;++i){            for(int j = 0;j<26;++j){                if(s1[i]-65==j){cnt1[j]++;break;}            }        }        for(int i = 0;i<len2;++i){            for(int j = 0;j<26;++j){                if(s2[i]-65==j){cnt2[j]++;break;}            }        }        sort(cnt1,cnt1+26);        sort(cnt2,cnt2+26);        bool eq = 1;        for(int i = 0;i<26;++i){            //printf("%d %d\n",cnt1[i],cnt2[i]);            if(cnt1[i]!=cnt2[i]){eq = 0;break;}        }        if(eq){            printf("YES\n");        }else{            printf("NO\n");        }    }    return 0;}

2.Uva489 Hangman Judge

#include<stdio.h>#include<string.h>#define MAX 100char s1[MAX],s2[MAX];bool win = 0,lose = 0;int left,chance;void guess(char c){    int len = strlen(s1);    bool find = 0;    for(int i = 0;i<len;++i){        if(s1[i]==c){            left--;            s1[i]= ;            find = 1;        }    }    if(!find)chance--;    if(!chance)lose = 1;    else if(!left)win = 1;}int main(){    int rd;    while(scanf("%d%s%s",&rd,s1,s2)==3&&rd!=-1){        win = 0;lose = 0;        printf("Round %d\n",rd);        chance = 7;        left = strlen(s1);        int len = strlen(s2);        for(int i = 0;i<len;++i){            guess(s2[i]);            if(win||lose)break;        }        if(win){            printf("You win.\n");        }else if(lose){            printf("You lose.\n");        }else{            printf("You chickened out!\n");        }    }    return 0;}

3.Uva133 The Dole Queue

#include<stdio.h>#include<string.h>int n,k,m;//人本身是按照逆时针排序的int go(int p,int d,int t,int a[]){    while(t--){        do{            p = (p-1+d+n)%n+1;        }while(a[p]==1);    }    return p;}int main(){    while(scanf("%d%d%d",&n,&k,&m)==3&&n){            int a[n+1];            memset(a,0,sizeof(a));            int p1 = n;            int p2 = 1;            int left = n;            while(left){//人数有剩余                p1 = go(p1,1,k,a);                p2 = go(p2,-1,m,a);                a[p1] = 1;                a[p2] = 1;                printf("%3d",p1);                --left;                if(p2!=p1){printf(" %3d",p2);--left;}                if(left)printf(",");            }            printf("\n");    }    return 0;}

4.Uva213 Message Decoding

#include<stdio.h>#include<string.h>int code[8][1<<8];int readchar(){    for(;;){        int ch = getchar();        if(ch!=\r&&ch !=\n)return ch;    }}int readint(int c){    int v = 0;    while(c--){        v = v*2+readchar()-0;    }    return v;}int readcodes(){    memset(code,0,sizeof(code));    code[1][0] = readchar();    int ch;    for(int len = 2;len<8;++len){        for(int i = 0;i<(1<<len)-1;++i){           ch = getchar();           if(ch==EOF)return 0;           if(ch == \n||ch == \r) return 1;           code[len][i] = ch;        }    }    return 1;}int main(){    while(readcodes()){        for(;;){            int len = readint(3);            if(len==0)break;            for(;;){                int v = readint(len);                if(v == (1<<len)-1)break;                putchar(code[len][v]);            }        }        printf("\n");    }    return 0;}

 

总结:以上每个小程序的代码量都不超过50行,但都是非常经典的小程序,采用自顶向下的编程方法,使得程序的逻辑非常清晰。

算法练习(一)