我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:
- 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
- 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。
那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。
输入格式:
输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。
输出格式:
在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。
思路: 数组模拟计数器
改进简化版
#include<iostream>
using namespace std;
int main()
{
int flag[6][6]={0},num,a[6]={7,7,7,7,7,7};
for(int z=0;z<6;z++) {
cin >> num;
flag[z][num-1] = 1;
}
cin >> num;
for(int z=0;z<6;z++)
{
for(int z1=0;z1<num;z1++)
{
a[z]--;
if(flag[z][a[z]-1]==1) a[z]--;
}
}
printf("%d %d %d %d %d %d",a[0],a[1],a[2],a[3],a[4],a[5]);
return 0;
}
原版
#include<iostream>
using namespace std;
int a,b,c,d,e,f;
int flag[6][6] = {0}; // 骰子计数器,记入六个骰子各个分别投出过的数
void op();
int main()
{
int num;
cin >> a >> b >> c >> d >> e >> f >> num;
while (num--) op();
printf("%d %d %d %d %d %d",a,b,c,d,e,f);
return 0;
}
void op() {
flag[0][a-1] = 1;// 记入这数已经被这个骰子要到过了
flag[1][b-1] = 1;
flag[2][c-1] = 1;
flag[3][d-1] = 1;
flag[4][e-1] = 1;
flag[5][f-1] = 1;
int change[6] = {0}; // 该数组为骰子改变过了的标记,0为没改变过
for(int z = 5;z>=0;z--){
if(flag[0][z]==0 && change[0]==0) { flag[0][z]++ ; a=z+1; change[0] = 1;}
if(flag[1][z]==0 && change[1]==0) { flag[1][z]++ ; b=z+1; change[1] = 1;}
if(flag[2][z]==0 && change[2]==0) { flag[2][z]++ ; c=z+1; change[2] = 1;}
if(flag[3][z]==0 && change[3]==0) { flag[3][z]++ ; d=z+1; change[3] = 1;}
if(flag[4][z]==0 && change[4]==0) { flag[4][z]++ ; e=z+1; change[4] = 1;}
if(flag[5][z]==0 && change[5]==0) { flag[5][z]++ ; f=z+1; change[5] = 1;}
}
}
水平有限,一下子只想到这个笨办法~

1418

被折叠的 条评论
为什么被折叠?



