UPC9565 骰子
题目描述
有一个n×m的网格,在网格的左上角(第1行第1列)有一个骰子。骰子的初始状态如下图所示(即上面为1,下面为6,左面为4,右面为3,前面为2,后面为5)。
现在按一定的规则滚动骰子。滚动骰子当然是有轨迹的。你需要从左到右滚动到右端,然后向下滚动一格然后在向左滚动到左端,再向下一格,如此反复,直到所有的格子都被经过为止。
你需要计算出骰子到达每个格点(包括初始的格子)时,骰子上方的数字之和。
现在按一定的规则滚动骰子。滚动骰子当然是有轨迹的。你需要从左到右滚动到右端,然后向下滚动一格然后在向左滚动到左端,再向下一格,如此反复,直到所有的格子都被经过为止。
你需要计算出骰子到达每个格点(包括初始的格子)时,骰子上方的数字之和。
输入
一行两个整数n,m(1≤n,m≤105)。
输出
一行一个整数表示答案。
样例输入
3 2
样例输出
19
提示
经过每个格子时骰子上面的数字依次为:1、4、5、1、3、5。
一开始在试图找他滚动的规律。。。。后来发现直接模拟每行最后几次滚动与换行之间的滚动就可以
#include "bits/stdc++.h" using namespace std; typedef long long ll; int roll[6] = {1, 4, 6, 3, 2, 5}; ll n, m; void toright() { int temp = roll[0]; roll[0] = roll[1]; roll[1] = roll[2]; roll[2] = roll[3]; roll[3] = temp; } void toleft() { int temp = roll[0]; roll[0] = roll[3]; roll[3] = roll[2]; roll[2] = roll[1]; roll[1] = temp; } void turn() { int temp = roll[4]; roll[4] = roll[0]; roll[0] = roll[5]; roll[5] = roll[2]; roll[2] = temp; } int main() { //freopen("input.txt", "r", stdin); scanf("%lld %lld", &n, &m); int len = m - 1; ll ans = 0; int to = len % 4; for (int i = 0; i < n; i++) { ans = ans + (roll[0] + roll[1] + roll[2] + roll[3]) * (len / 4); //cout<<ans<<endl; //cout<<to<<endl; if (i % 2 == 0) { for (int j = 0; j < to; j++) { ans += roll[0]; toright(); } } else { for (int j = 0; j < to; j++) { ans += roll[0]; toleft(); } } ans += roll[0]; turn(); } printf("%lld\n", ans); return 0; }