hx打麻将
最近hx073269沉迷日本麻将,但hx073269觉得日本麻将的算点太过困难,所以hx073269发明了一种全新的麻将,名为hx麻将。
hx麻将供四人游玩,每一次只进行八局,在第八局结束之后根据四人的点数来决定每个人的名次。
这天hx073269又开始打hx麻将了,由于hx073269脸太黑,又不想输给他的小伙伴们,擅长出千的hx073269拿出了他的遥控麻将,导致从第二局到第八局一直在赢。
现在已知在第一局时hx073269的方位(东/南/西/北),第一局结束的时候四个人的点数,hx073269七局得点的番数x(5≤x≤100),问在第八局结束的时候四个人的点数。
hx麻将规则:
麻将桌是一个正方形,每一个人都坐在一个正方形的一个边上,正方形的每个边上都刻有一个方位。
每条边的方位按逆时针顺序是:东、南、西、北、东、南、西、北(即,若自己是南,则从自己开始逆时针数过去第一个人是西)。
在每一局结束的时候正方形按逆时针方向旋转(即,若这一局自己是南,下一局自己是东)。
自己所在边的方位为东的时候算作庄家。
规则为无击飞,即有人分数变为负分后继续游戏。
点数计算:
作为非庄家得点时:
除了得点者以外,非庄家失去点数为得点者所得点数 / 4,庄家的失去点数为非庄家的失去点数的两倍。
作为庄家得点时:
得点为非庄家得点时的 1.5 倍。
除了得点者以外,每一个人的失去点数为得点者所得点数 / 3。
输入
第一行一个大写字母 C,表示第一局时hx073269所在的方位。
C=E,则为东。
C=S,则为南。
C=W,则为西。
C=N,则为北。
接下来一行四个整数A,B,C,D(0≤A,B,C,D≤100000) 表示四个人在第一局结束时的点数,顺序为从hx073269开始逆时针输入。
接下来一行七个整数xi(5≤xi≤100) 表示从第二局到第八局 hx073269的赢点番数。
输出
一行四个整数,表示第八局结束后四个人的点数,顺序为从hx073269开始逆时针方向输出。
样例输入
E
25000 25000 25000 25000
5 5 5 5 5 5 5
样例输出
85000 5000 5000 5000
一.思路
本题应该根据题目意思进行模拟,注意一点: 输入的是第一局的位置,而已经进行到第二局故要根据规则进行更换位置
AC代码:
#include<stdio.h>
struct book
{
char l;
int val;
}a[4];
int f(int x);
int main()
{
char b[4]={'E','S','W','N'};
int x[7];
scanf("%c",&a[0].l);
for(int i=0;i<4;i++)
{
if(a[0].l==b[i])
{
i--;
if(i<0) i=3;
a[0].l=b[i];
for(int j=1;j<4;j++)
{
i++;
if(i>3) i=0;
a[j].l=b[i];
}
break;
}
}
for(int i=0;i<4;i++)
{
scanf("%d",&a[i].val);
}
for(int i=0;i<7;i++)
{
scanf("%d",&x[i]);
}
for(int i=0;i<7;i++)
{
if(a[0].l==b[0])
{
a[0].val+=1.5*f(x[i]);
for(int j=1;j<4;j++)
{
a[j].val-=f(x[i])/2;
}
a[0].l='N';
a[1].l='E';
a[2].l='S';
a[3].l='W';
}
else
{
a[0].val+=f(x[i]);
for(int j=1;j<4;j++)
{
if(a[j].l=='E')
a[j].val-=(f(x[i])/4)*2;
else
a[j].val-=f(x[i])/4;
}
for(int k=0;k<4;k++)
{
if(a[k].l=='E') a[k].l='N';
else if(a[k].l=='S') a[k].l='E';
else if(a[k].l=='W') a[k].l='S';
else if(a[k].l=='N') a[k].l='W';
}
}
}
for(int i=0;i<4;i++)
printf("%d ",a[i].val);
return 0;
}
int f(int x)
{
switch(x)
{
case 5: return 8000;
case 6:
case 7: return 12000;
case 8:
case 9:
case 10: return 16000;
case 11:
case 12: return 24000;
default: return 32000;
}
}