L1-5 试试手气

我们知道一个骰子有 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;}
    }
}

水平有限,一下子只想到这个笨办法~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块不一样的石头

十分满意,一分打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值