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点最大,其次是6,5,4,3,2。
- 三个骰子点数相同,称为"豹子",豹子之间按点数优先级比较大小。
- 如果只有两个骰子点数相同,称为"对子",对子之间按点数优先级比较大小。
- 其他情况称为"点子",点子按点数和比较大小。
- 豹子比对子、点子大,对子比点子大,如果对子的点数优先级相同,就看剩余那个骰子的点数优先级。
现在给你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 。每个任务需要先完成