ACM模拟专题

1.1227-XTUOJ

题目描述

假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为

  • LEFT:向左转
  • RIGHT:向右转
  • BACK:向后转
  • FORWORD n:向前走n(1≤n≤100)个单位
现在给你一个指令序列,求机器人最终的位置。

输入

样例的第一行是一个整数T(T≤20),表示样例的个数。 每个样例的第一行是一个整数N(1≤N≤1,000),表示指令的条数。 以后的N行,每行一条指令。

输出

每个样例输出两个整数,为坐标(x,y),之间用空格隔开。

样例输入
2
4
LEFT
FORWORD 1
RIGHT
FORWORD 1
2
BACK
FORWORD 1

样例输出
-1 1
0 -1

考点:动作过程的模拟实现,找规律。

易错:字符读取数字,必须注意两位以及两位以上的数字

思路:审题,由题意得知是在坐标轴分析,题目的关键在于我们怎么求得机器人的朝向。根据三角函数很容易得出机器人转向的规律,由该规律直接模拟即可得出最终代码。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAX 100
typedef char SString[MAX];

int main()
{
    int T,N;
    SString str;
    scanf("%d",&T);
    while(T--)
    {
        int flag=0;
        int step;
        int x,y;
        x=y=0;
        scanf("%d",&N);
        getchar();
        while(N--)
        {
            gets(str);
            if(str[0]=='L') flag--;
            if(str[0]=='R') flag++;
            if(str[0]=='B') flag+=2;
            if(str[0]=='F')
            {
               int length=strlen(str);
               if(length==9) step=str[8]-'0';
               else if(length==10) step=(str[8]-'0')*10+str[9]-'0';
                else step=100;
                if(flag%4==0) y+=step;
                if((flag-1)%4==0) x+=step;
                if((flag-2)%4==0) y-=step;
                if((flag-3)%4==0) x-=step;
            }
        }
        printf("%d %d\n",x,y);
    }
    return 0;
}

2.1248-XTUOJ

Alice和Bob在玩骰子游戏,他们用三颗六面的骰子,游戏规则如下:

  1. 点数的优先级是1点最大,其次是6,5,4,3,2。
  2. 三个骰子点数相同,称为"豹子",豹子之间按点数优先级比较大小。
  3. 如果只有两个骰子点数相同,称为"对子",对子之间按点数优先级比较大小。
  4. 其他情况称为"点子",点子按点数和比较大小。
  5. 豹子比对子、点子大,对子比点子大,如果对子的点数优先级相同,就看剩余那个骰子的点数优先级。

现在给你Alice和Bob投掷骰子的情况,判断一下胜负情况。

输入

第一行输入一个整数K,表示游戏的次数。 以后每两行表示一个样例,第一行是Alice骰子的点数。第二行是Bob骰子的点数。

输出

如果是Alice赢,输出"Alice",如果是Bob赢,输出"Bob",否则输出"Draw"。

样例输入

3
1 1 1
6 6 6
2 1 2
4 5 4
4 5 6
6 5 4

样例输出

Alice
Bob
Draw

考点:过程的模拟实现。

易错:题意的理解--点数的优先级。

解题思路:

      理解题目,题目要求我们去实现这个过程。要模拟这个过程,必须弄清楚这个过程有哪些步骤,然后用函数分别实现这些步骤,这样也方便调试。由题可知,我们要实现下列这些函数功能。

(1)点数优先级的比较。

(2)豹子对子点子的判断。

(3)豹子同豹子,点子同点子以及对子同对子之间的比较。其中,对子同对子的比较比较容易出错。

      想好这些逻辑以后,我们开始实现这个过程即可。注意,两个对子最多要比较两次数字优先级,如果在敲代码之前没有注意到这点,就会让整个程序出错。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int flag;


int Scan(int a[])
{
    if(a[0]==a[1]&&a[1]==a[2]) return 3;
   else if((a[0]==a[1])||(a[0]==a[2])||(a[1]==a[2]))return 2;
   else return 1;
}

void num_judge(int a,int b)
{
    if(a==1||b==1)
    {
        if(a==1&&b==1) flag=3;
        else if(a==1) flag=1;
        else  flag=2;
    }
    else if(a>b) flag=1;
    else if(a<b) flag=2;
    else flag=3;
}


void Left(int a[],int b[])//对子之间的比较
{
    sort(a,a+3);
    sort(b,b+3);
    if(a[1]==b[1])
    {
        int t1,t2;
        if(a[1]==a[0]) t1=a[2];
        else t1=a[0];
        if(b[1]==b[0]) t2=b[2];
        else t2=b[0];
        num_judge(t1,t2);
    }
    else
    {
        if(a[1]==1) flag=1;
        else if(b[1]==1) flag=2;
        else if(a[1]>b[1]) flag=1;
        else flag=2;
    }
}


int main()
{
    int a[5],b[5];
    int K;
    scanf("%d",&K);
    while(K--)
    {
        int judge_1,judge_2;
        for(int i=0; i<3; i++) scanf("%d",&a[i]);
        for(int i=0; i<3; i++) scanf("%d",&b[i]);
        judge_1=Scan(a);
        judge_2=Scan(b);
        if(judge_1>judge_2) printf("Alice\n");
        else if(judge_1<judge_2) printf("Bob\n");
        else
        {
            if(judge_1==3) num_judge(a[0],b[0]);
            else if(judge_1==1)
            {
                int sum1=a[0]+a[1]+a[2];
                int sum2=b[0]+b[1]+b[2];
                if(sum1>sum2) flag=1;
                else if(sum1<sum2) flag=2;
                else flag=3;
            }
            else Left(a,b);
            if(flag==1) printf("Alice\n");
            if(flag==2) printf("Bob\n");
            if(flag==3) printf("Draw\n");
        }
    }
    return 0;
}

3.1253-XTUOJ

N 个任务需要Robot去完成,这个N个任务的地点在一个数轴上,坐标为1 n 。每个任务需要先完成

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值