您的位置:首页 > 其它

jzoj3082. 【NOIP2012模拟11.1】骰子游戏

2016-08-18 19:38 253 查看

题目

滚骰子是一件有益身心健康的运动,因此骰子游戏可是一个很受年轻人欢迎的游戏。

现在先介绍一下这个闻名遐迩的骰子游戏吧。

首先是主角:骰子。骰子就是很普通的骰子:骰子有六个面,分别标号1到6,三对面上的数字之和均为7。以下是骰子的一个图示。



然后我们介绍这个游戏的地图:一个R*C的网格图。

骰子一开始的状态如上图所示(即上面为 1,下面为 6,左面为 4,右面为 3,前

面为 2,后面为 5),且位置在左上角。

然后重头戏来了,你需要的操作就是滚动骰子。滚动骰子当然是有轨迹的。你需要从左到右滚动到右端,然后向下滚动一格然后在向左滚动到左端,再向下一格,如此反复…直到最下面一行为止。

游戏的目的就是请你计算出骰子到达每个格点时,骰子上方的数字之和。

Input

第一行包含两个整数 R 和 C。

Output

输出仅一行,表示表示数字之和。

Sample Input

3 2

Sample Output

19

Hint

对于50%的数据1<=R,C<=100

对于100%的数据 1<=R,C<=100000

样例 1 经过每个格子时骰子上面的数字依次为:1 4 5 1 3 5。

分析

滚骰子要一行行滚,对于每行有循环,所以可以O(n)解决。

代码

#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
long long n,m,ans,a[6]={1,6,2,5,4,3};
void gun1()
{
long long t=a[0];
a[0]=a[4];
a[4]=a[1];
a[1]=a[5];
a[5]=t;
}
void gun2()
{
long long t=a[0];
a[0]=a[5];
a[5]=a[1];
a[1]=a[4];
a[4]=t;
}
void gun3()
{
long long t=a[0];
a[0]=a[3];
a[3]=a[1];
a[1]=a[2];
a[2]=t;
}
int main()
{
scanf("%lld%lld",&n,&m);
m--;
for (int i=1;i<=n;i++)
{
ans+=a[0];
ans+=(a[0]+a[1]+a[2]+a[3])*floor(m/4);
if (i%2)
{
for(int i=1;i<=m%4;i++)
{
gun1();
ans+=a[0];
}
}
else
{
for(int i=1;i<=m%4;i++)
{
gun2();
ans+=a[0];
}
}
gun3();
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: