天梯赛L1-085 试试手气

发布时间 2023-05-22 12:49:56作者: 我爱软工

一、问题描述

sz.png

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1n5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1n5)。

输出格式:

在一行中顺序列出第 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
 
 

二、设计思路

(1)先定义一个整型数组a来保存第一次骰子的点数;

(2)再定义一个变量n,并从键盘键入,表示投骰子的次数;

(3)根据题目要求,要求每个骰子每次的点数不能比之前的任何一次大,因此让这6骰子初始值都为7,每投一次,判断骰子点数-1;如果在执行完-1操作后x的值与该枚骰子第一次的点数相同,则再-1;

(4)遍历完六个骰子之后对相应结果进行输出;

三、程序流程图

 

四、伪代码

五、代码

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a[7]={0};
 6     int n=0;
 7     for(int i=0;i<6;i++)
 8     {
 9         cin>>a[i];
10     }
11     cin>>n;
12     for(int i=0;i<6;i++)
13     {
14         int x=7;
15         for(int j=0;j<n;j++)
16         {
17            
18             x--;
19              if(a[i]==x)
20             {
21                 x--;
22             }
23             
24         }
25         
26         if(i<5)
27         {
28             cout<<x<<" ";
29         }
30         else
31         {
32             cout<<x;
33         }
34     }
35     return 0;
36 }
37     

 

六、总结

(1)骰子点数要求不重复,且取其中最大值,可以先给最大值,再逐渐递减,得到符合要求的最大值;