zoukankan      html  css  js  c++  java
  • 2017程序设计练习题之模拟专题

    A题

    //设四个数组分别表示4个方向,然后根据他是left还是right将下标记录+1或者-1然后Forward的话就是现在的下标记录数组加上这个值。具体的看下代码吧。
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        int n,a,b,c,l;
        char str[10];
        scanf("%d",&n);
        while(n--)
        {
            int aa[4]={0,0,0,0};
            int a=0,b=0,l,x,y;
            scanf("%d",&c);
            int i=0;
            while(c--)
            {
                scanf("%s",str);
                if(strcmp(str,"LEFT")==0)i=(i+3)%4;
                else if(strcmp(str,"RIGHT")==0)i=(i+5)%4;
                else if(strcmp(str,"BACK")==0)i=(i+2)%4;
                else if(strcmp(str,"FORWORD")==0)
                {
                    scanf("%d",&l);
                    getchar();
                     aa[i]+=l;
                }
               // printf("%d %d %d
    ",i,aa[i],l);
    
                y=aa[0]-aa[2];
                x=aa[1]-aa[3];
            }
            printf("%d %d
    ",x,y);
        }
    }
    

    B题

    //将每题的第一滴血放在数组里记录下来,如果这题还没有出现Accepted的话直接放入,或者后面出现的Accepted记录的时间比数组记录的要早,要注意这里的时间可不一定是有序的哦。然后将每题的数组记录打印出来就好了。
    #include<stdio.h>
        #include<string.h>
        int main()
        {
            int fb[20];
            char name[20][20],str[200],time[20][15];
            int n,i,num;
            char na[20],ans[20],ti[15],c;
            scanf("%d",&n);
            memset(fb,0,sizeof(fb));
            getchar();
            while(scanf("%s %s %d %s",&ti,&na,&num,&ans)!=EOF)
            {
                while(c=getchar(),c!='
    ');
                num-=1000;
                if(strcmp(ans,"Accepted")==0)
                {
                    if(fb[num]==0||strcmp(ti,time[num])<0)
                    {
                        fb[num]=1;
                        strcpy(name[num],na);
                        strcpy(time[num],ti);
                    }
                }
            }
            for(i=1;i<=n;i++)
            {
                if(fb[i]==0)
                    printf("%d
    ",i+1000);
                else
                    printf("%d %s %s
    ",i+1000,time[i],name[i]);
            }
    
        }
    
    

    C题

    //这题就是题目怎么说你怎么做,纯模拟题。
    
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    int main(){
    
        __int64 x;
        __int64 num[4];
        while(~scanf("%I64d",&x)){
            __int64 s = x*x;
            __int64 ss= s;
            //printf("%I64d
    ",s);
            int digit = 0;
            while(ss){
                ss /= 10;
                digit++;
            }
            //printf("%d
    ",digit);
            if(digit&1) digit++;
            if(digit<=4) printf("%I64d
    ",s);
            else {
                digit /= 2;
                ss = s;
                for(int i=0;i<digit-2;i++) ss/=10;
                for(int i=0;i<4;i++){
                    num[i] = ss%10;
                    ss /= 10;
                }
                __int64 ans = 0;
                for(int i=3,tmp=1000;i>=0;i--,tmp/=10){
                    ans += num[i]*tmp;
                }
                printf("%I64d
    ",ans);
            }
        }
        return 0;
    }
    
    

    D题

    //这题我第一遍遍历ISBN码计算取余后的值,当遇到问号就直接跳过,第二次遍历时,如果他是问号就分别用1~10去试之前的值加上这里的值能不能取余到0,如果取余到0就得出答案。
    #include<bits/stdc++.h>
    
    using namespace std;
    
    char s[30];
    int main(){
        while(gets(s)!=0){
            int sum = 0;
            for(int i = 0;i < 10;i++){
                if(s[i]=='?')continue;
                int tmp = -1;
                if(s[i]=='X')tmp = 10;
                else tmp = s[i] - '0';
                sum += (10-i)*tmp;
                sum %= 11;
            }
            for(int i = 0;i < 10;i++){
                if(s[i]=='?'){
                    for(int j = 0;j <= 10;j++){
                        if((sum+(10-i)*j)%11==0){
                            if(j==10)s[i]='X';
                            else s[i] = j + '0';
                            break;
                        }
                    }
                }
            }
            puts(s);
        }
        return 0;
    }
    

    E题

    //这题先用a[i][j]表示i到j能不能直接到达。如果不能直接达到,那么就通过判断i和j的中点之前有没有访问过,如果有访问过i也能到j。如果这两种方式都到达不了就GG.
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int main(){
        int t;
        cin>>t;
        int a[9][9]={0,1,0,1,1,1,0,1,0,
                         1,0,1,1,1,1,1,0,1,
                         0,1,0,1,1,1,0,1,0,
                         1,1,1,0,1,0,1,1,1,
                         1,1,1,1,0,1,1,1,1,
                         1,1,1,0,1,0,1,1,1,
                         0,1,0,1,1,1,0,1,0,
                         1,0,1,1,1,1,1,0,1,
                         0,1,0,1,1,1,0,1,0};
        int b[100];
        while(t--){
            string s;
            cin>>s;
            bool flag = true;
            int len = s.length();
            memset(b,0,sizeof(b));
            for(int i = 0;i < len-1;i++){
                if(a[s[i]-'1'][s[i+1]-'1']==1){
                    b[s[i]-'1'] = 1;
                }else{
                    if(b[(s[i]+s[i+1]-2*'1')/2]==1){
                        b[s[i]-'1'] = 1;
                    }else{
                        flag = false;break;
                    }
                }
            }
            flag?puts("Yes"):puts("No");
        }
        return 0;
    }
    

    F题

    //两种解法,第一种就像题目写的,先判断是有几个相等,设flag1,如果三个相等为3,如果有两个相等为2,如果三个都不相等为1,比较是如果flag1有一个大于另一个直接比较,否则两者的flag1
    都是1比较三个骰子点数相加,为3时比较相同的谁大,如果都是2相对复杂点。
    //用权值思想,如果三个都相等三个的权值都是点数*10000,如果两个相等权值为点数*100否则为*1这样就能分开三种类型。
    //另外1最大,所以直接1等于7
    
    #include<stdio.h>
    int cal(int a,int b,int c){
        if(a==b&&b==c){
            if(a==1) a=7;
            return a*1000;
        }
        else if((a==b&&a!=c)){
            if(a==1) a=7;
            if(c==1) c=7;
            return a*100+c;
        }
        else if((a==c&&b!=c)){
            if(a==1) a=7;
            if(b==1) b=7;
            return a*100+b;
        }
        else if((b==c&&a!=c)){
            if(b==1) b=7;
            if(a==1) a=7;  
            return b*100+a;
        }
        else{
            return a+b+c;
        }
    }
    int main(){
        int time;
        scanf("%d",&time);
        while(time--){
            int a,b,c;
            int x,y,z;
            scanf("%d %d %d",&a,&b,&c);
            scanf("%d %d %d",&x,&y,&z);
            int sum1=cal(a,b,c);
            int sum2=cal(x,y,z);
            if(sum1>sum2){
                puts("Alice");
            }
            else if(sum2>sum1){
                puts("Bob");
            }
            else{
                puts("Draw");
            }
        }
        return 0;
    }
    
    //2048游戏很经典了,其实就是模拟这个过程,具体的大家看代码吧,不过解释下思路吧。我先写好一个方向的转换,其他的我先把矩阵转换方向使他在我指定的方向去弄,这样就不用写4个方向的代码。
    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn = 4;
    int a[4][4];
    void translate(){
        for(int i = 0;i < maxn;i++){
            for(int j = 0;j < maxn;j++){
                if(j+1<maxn&&a[i][j]==a[i][j+1]){
                    a[i][j] *= 2;
                    a[i][j+1] = 0;
                    j++;
                }
                if(j+2<maxn&&a[i][j]==a[i][j+2]&&a[i][j+1]==0){
                    a[i][j] *= 2;
                    a[i][j+2] = 0;
                    j+=2;
                }
                if(j+3<maxn&&a[i][j]==a[i][j+3]&&a[i][j+1]==0&&a[i][j+2]==0){
                    a[i][j] *= 2;
                    a[i][j+3] = 0;
                    j+=3;
                }
            }
        }
        for(int i = 0 ;i < maxn;i++){
            int s[maxn];
            int cnt = 0;
            memset(s,0,sizeof(s));
            for(int j = 0;j<maxn;j++)if(a[i][j])s[cnt++]=a[i][j];
            for(int j = 0;j<maxn;j++)a[i][j] = s[j];
        }
    }
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            memset(a,0,sizeof(a));
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    scanf("%d",&a[i][j]);
                }
            }
            char str[10];
            scanf("%s",str);
    
            if(str[0]=='D'){
                for(int i=0;i<4;i++){
                    for(int j=0;j<3-i;j++){
                        swap(a[i][j],a[3-j][3-i]);
                    }
                }
                translate();
                for(int i=0;i<4;i++){
                    for(int j=0;j<3-i;j++){
                        swap(a[i][j],a[3-j][3-i]);
                    }
                }
            }
            else if(str[0]=='L')translate();
            else if(str[0]=='U'){
                for(int i=0;i<4;i++){
                    for(int j=3;j>i;j--){
                        swap(a[i][j],a[j][i]);
                    }
                }
                translate();
                for(int i=0;i<4;i++){
                    for(int j=3;j>i;j--){
                        swap(a[i][j],a[j][i]);
                    }
                }
    
            }else if(str[0]=='R'){
                for(int i=0;i<4;i++){
                    for(int j=0;j<2;j++){
                        swap(a[i][j],a[i][3-j]);
                    }
                }
                translate();
                for(int i=0;i<4;i++){
                    for(int j=0;j<2;j++){
                        swap(a[i][j],a[i][3-j]);
                    }
                }
            }
            for(int i=0;i<4;i++){
                for(int j=0;j<3;j++){
                    printf("%d ",a[i][j]);
                }
                printf("%d
    ",a[i][3]);
            }
            printf("
    ");
        }
        return 0;
    }
    
    

    H题

    //其实就是第一轮1先走到n,第二轮n再走回1,反正你都要换方向还不如直接走到头更划算。
    
    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn =  1000;
    int a[maxn];
    int main(){
        int n;
        while(~scanf("%d",&n)){
            for(int i = 0;i < n;i++)scanf("%d",&a[i]);
            int turn = 0;
            int complete = 0;
            while(complete < n){
                if(turn&1){
                    for(int i = n-1;i >= 0 ;i--){
                        if(complete >= a[i]){
                            complete++;
                            a[i] = 0x3f3f3f3f;
    
                        }
                    }
                }else{
                    for(int i = 0;i < n;i++){
                        if(complete>= a[i]){
                            a[i] = 0x3f3f3f3f;
                            complete++;
                        }
                    }
                }
                turn++;
            }
            printf("%d
    ",turn-1);
        }
    }
    
    

    I题

    //这题...纯模拟吧。不过需要注意的是你转换的那行(列)必须换个数组来存,否则不好处理。
    
    int T,n,m;
    const int maxn = 11;
    int arr[maxn][maxn];
    
    int init(int n)
    {
        int num=1;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                arr[i][j]=num++;
    }
    char s[10];
    
    void solve(int x,int y)
    {
        int b[10];
        switch (s[0])
        {
        case 'L':
            for (int i=0;i<n;i++)
                b[i]=arr[x][(i+y)%n];
            for (int i=0;i<n;i++)
                arr[x][i]=b[i];
            break;
        case 'R':
            for (int i=0;i<n;i++)
                b[i]=arr[x][(n+i-y)%n];
            for (int i=0;i<n;i++)
                arr[x][i]=b[i];
            break;
        case 'D':
            for (int i=0;i<n;i++)
                b[i]=arr[(i-y+n)%n][x];
            for (int i=0;i<n;i++)
                arr[i][x]=b[i];
            break;
        case 'U':
            for (int i=0;i<n;i++)
                b[i]=arr[(i+y)%n][x];
            for (int i=0;i<n;i++)
                arr[i][x]=b[i];
            break;
        }
    }
    
    void print()
    {
        for(int i=0;i<n-1;i++)
            for (int j=0;j<n;j++)
                printf("%d ",arr[i][j]);
        for (int j=0;j<n-1;j++)
            printf("%d ",arr[n-1][j]);
        printf("%d
    ",arr[n-1][n-1]);
    }
    
    int main()
    {
    
        int x,y;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            init(n);
            for(int i=0;i<m;i++)
            {
                scanf("%s%d%d",s,&x,&y);
                solve(x-1,y);
            }
            print();
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    关于IE6不能兼容LCUC使用的PNG透明图象
    rmvb压制中高级技巧
    不错的课件网站
    C#程序多用户只启动一个进程的方法
    不可想像的加密光盘复制工具
    检测远程URL是否存在的三种方法
    请哪里有英文单词单复数转换的代码?
    一些感想,欢迎拍砖
    Some thoughts on my own O/R Mapping or Code Generation tools
    有了net send,谁还用IM?
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/6974039.html
Copyright © 2011-2022 走看看