题解:B3760 [信息与未来 2021] 掷骰子
xiaoyi_zeng · · 题解
B3760 [信息与未来 2021] 掷骰子 题解
写在前面
下文中图片可能字不是很好看,如果需调整指出即可。
UPD 7/27 将图床链接更新
正片
首先,这道题的这一个部分很吸引人:
的确,这提示了这题的一个不错的想法:暴力枚举,检验。
第一部分:暴力枚举
非常容易(不用想象中复杂的深搜),只需要一个六重循环即可。
随后根据题意修改:
int mn = 50, mx = 1;
for (a = 1; a <= 6; a++)
{
for (b = 1; b <= 6; b++)
{
for (c = 1; c <= 6; c++)
{
for (d = 1; d <= 6; d++)
{
for (e = 1; e <= 6; e++)
{
for (f = 1; f <= 6; f++)
{
int sum = a + b + c + d + e + f;
if (judge()){
mn = min(mn, sum);
mx = max(mx, sum);
}
}
}
}
}
}
}
第二部分:检验
根据上文所说,我们需要一个用于检验的函数。
那么代码:
bool judge()
{
// ...
}
然后,我们只需要枚举每一个条件,看看有没有符合的。
那么代码:
bool judge()
{
for (int i = 1; i <= n; i++)
{
// ...
}
return true;
}
接下来对循环里面的判断条件进行思考:
这里采取一种暴力的方式来映衬上面暴力的枚举:直接枚举每一种拍摄角度,判断是否和条件吻合即可,不过我们需要一些准备。
首先,我们计算不同角度拍摄的方案总数:一共有六个面,对于每个面在顶上,一共有四种拍摄角度,即:
那么,我们先画24个正方体:
随后,根据上面的计算,每个面作为顶有4个角度,于是我们把每个正方体的顶部画出来:
接着,只需要拿一个长方体(我选用了牛奶盒),六个面分别标上:abcdef。
出示一下我的标注字母的图片,以便下文描述。
众所周知,正方体展开图是六上第一个单元的内容。
接下来,以每个面为顶,转动长方体,记录剩余两个面的字母。
以下是我的结果:
那么判断函数也就能写出来了。这里的代码太长了,我就不出示了,毕竟在最后代码里也有的。
小技巧:
可以用:uvw来代替:
你们期待的 AC 代码!你的键盘上不只有 ctrl, c, v 这三个键!
不要贬我的码风555...
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
int n, x[N], y[N], z[N];
int a, b, c, d, e, f;
bool judge()
{
for (int i = 1; i <= n; i++)
{
int u = x[i], v = y[i], w = z[i];
if (u == a && v == c && w == d)
continue;
if (u == a && v == d && w == f)
continue;
if (u == a && v == f && w == b)
continue;
if (u == a && v == b && w == c)
continue;
if (u == b && v == e && w == c)
continue;
if (u == b && v == c && w == a)
continue;
if (u == b && v == a && w == f)
continue;
if (u == b && v == f && w == e)
continue;
if (u == c && v == e && w == d)
continue;
if (u == c && v == d && w == a)
continue;
if (u == c && v == a && w == b)
continue;
if (u == c && v == b && w == e)
continue;
if (u == d && v == e && w == f)
continue;
if (u == d && v == f && w == a)
continue;
if (u == d && v == a && w == c)
continue;
if (u == d && v == c && w == e)
continue;
if (u == e && v == f && w == d)
continue;
if (u == e && v == d && w == c)
continue;
if (u == e && v == c && w == b)
continue;
if (u == e && v == b && w == f)
continue;
if (u == f && v == e && w == b)
continue;
if (u == f && v == b && w == a)
continue;
if (u == f && v == a && w == d)
continue;
if (u == f && v == d && w == e)
continue;
return false;
}
return true;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> x[i] >> y[i] >> z[i];
}
int mn = 50, mx = 0;
for (a = 1; a <= 6; a++)
{
for (b = 1; b <= 6; b++)
{
for (c = 1; c <= 6; c++)
{
for (d = 1; d <= 6; d++)
{
for (e = 1; e <= 6; e++)
{
for (f = 1; f <= 6; f++)
{
if (judge())
{
mn = min(mn, a + b + c + d + e + f);
mx = max(mx, a + b + c + d + e + f);
}
}
}
}
}
}
}
cout << mn << " " << mx << "\n";
}
本蒟蒻耗费快两个月写完的 (我只有周末或者放假有空),重审多次,有错请指出,求赞 qwq。