算法练习(一)

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

  今年国家奖学金的名额里面没有我,没有就算了吧。卧薪尝胆,好好学习,这一学期至关重要。所以自己现在就要开始准备保研的机试,现在的训练非常重要,无论如何,这是自己未来要走的一步路。我现在最重要的就是六级、学习、机试、科研,这四个缺一不可。加油加油!所以今天是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
",cnt1[i],cnt2[i]);
            if(cnt1[i]!=cnt2[i]){eq = 0;break;}
        }

        if(eq){
            printf("YES
");
        }else{
            printf("NO
");
        }
    }

    return 0;
}

2.Uva489 Hangman Judge

#include<stdio.h>
#include<string.h>
#define MAX 100

char 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
",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.
");
        }else if(lose){
            printf("You lose.
");
        }else{
            printf("You chickened out!
");
        }
    }

    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("
");
    }
    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!='
'&&ch !='
')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 == '
'||ch == '
') 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("
");
    }
    return 0;
}

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

原文地址:https://www.cnblogs.com/lueagle/p/5925904.html