我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:
- 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
- 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。
那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。
输入格式:
输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。
输出格式:
在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。
输入样例:
3 6 5 4 1 4
3
输出样例:
4 3 3 3 4 3
样例解释:
这 3 次摇出的结果依次为:
6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3
C语言:
初始 | 3 | 6 | 5 | 4 | 1 | 4 |
第一次 | 6 | 5 | 6 | 6 | 6 | 6 |
第二次 | 5 | 4 | 4 | 5 | 5 | 5 |
第三次 | 4 | 3 | 3 | 3 | 4 | 3 |
上述表格中是按照题意以精妙的手法仍三次骰子的结果
由上表可以发现,初始值不是6的骰子第一次扔的时候结果都是最大值6,而后面几次仍的结果递减,后续所有的结果只可能与骰子初始值重复,否则其他几次的结果呈现递减趋势都不会重复
所以思路如下 :
如果骰子初始值为6则直接按照读入的次数进行递减;
如果骰子初始值不为6,那么第一次仍的结果必然是6,而后按照读入的次数-1进行递减,在此过程中如果得到的结果与骰子初始值相同那么需要再减一避免重复。
#include <stdio.h>
int main()
{
int a[7]={0},i,n,j,mid;
for(i=0;i<6;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&n);
for(i=0;i<6;i++)
{
if(a[i]!=6)
{
mid=a[i];
a[i]=6;
for(j=0;j<n-1;j++)
{
a[i]--;
if(a[i]==mid)
{
a[i]--;
}
}
}
else if(a[i]==6)
{
for(j=0;j<n;j++)
{
a[i]--;
}
}
printf("%d",a[i]);
if(i!=5)
{
printf(" ");
}else
{
printf("\n");
}
}
return 0;
}