zoukankan      html  css  js  c++  java
  • 算法练习(一)

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

      今年国家奖学金的名额里面没有我,没有就算了吧。卧薪尝胆,好好学习,这一学期至关重要。所以自己现在就要开始准备保研的机试,现在的训练非常重要,无论如何,这是自己未来要走的一步路。我现在最重要的就是六级、学习、机试、科研,这四个缺一不可。加油加油!所以今天是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行,但都是非常经典的小程序,采用自顶向下的编程方法,使得程序的逻辑非常清晰。

  • 相关阅读:
    merge into语句的使用
    mybatis框架下解决数据库中表的列的字段名和实体类属性不相同的问题
    Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
    Mybatis框架基于注解的方式,实对数据现增删改查
    java中的泛型和sql中的索引
    SpringMVC框架下的异常处理
    SpringMVC框架下的拦截器
    在SpringMVC框架下实现数据的国际化(即数据实现多国文字之间的转换)
    Java 随机数生成工具RandomUtils
    Java 获取客服端ip地址
  • 原文地址:https://www.cnblogs.com/lueagle/p/5925904.html
Copyright © 2011-2022 走看看