首页 > 代码库 > 算法练习(一)
算法练习(一)
昨天是个值得纪念的日子,我数学建模拿了推荐国家一等奖的名额,希望最后能顺利拿到国一吧。现在大三已经开学一个月了。这一个月因为社会实践评优的事情真的很忙,还好最后拿到了可能拿到的所有的奖项。结果自己把科研助手这件事给耽误了,今天去找马老师,结果马老师的实验室人已经满了。所以没办法,我可能又要去找其他老师了。
今年国家奖学金的名额里面没有我,没有就算了吧。卧薪尝胆,好好学习,这一学期至关重要。所以自己现在就要开始准备保研的机试,现在的训练非常重要,无论如何,这是自己未来要走的一步路。我现在最重要的就是六级、学习、机试、科研,这四个缺一不可。加油加油!所以今天是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行,但都是非常经典的小程序,采用自顶向下的编程方法,使得程序的逻辑非常清晰。
算法练习(一)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。