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\n",i,aa[i],l);

            y=aa[0]-aa[2];
            x=aa[1]-aa[3];
        }
        printf("%d %d\n",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!='\n');
            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\n",i+1000);
            else
                printf("%d %s %s\n",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\n",s);
        int digit = 0;
        while(ss){
            ss /= 10;
            digit++;
        }
        //printf("%d\n",digit);
        if(digit&1) digit++;
        if(digit<=4) printf("%I64d\n",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\n",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\n",a[i][3]);
        }
        printf("\n");
    }
    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\n",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\n",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;
}


posted @ 2017-06-09 22:32  adfae  阅读(752)  评论(0编辑  收藏  举报