2-7 旋转骰子

2-7 旋转骰子 (100分)

玛莎有n个骰子,每个骰子的6个面上都恰好有一个0到9之间的数字。

现在玛莎将利用这n个筛子来制作新数字。她把n个骰子摆成一排,然后从左到右查看骰子的上表面并读取,即可得到一个新数字。随后她不断的旋转每个骰子的面就可以得到不同的新数字。旋转骰子需要满足以下规则: 1、制作的数字不能包含前导零; 2、制作新数字时不需要使用所有的骰子; 3、使用骰子旋转,无法将数字9转换为数字6,反之亦然。

给定n个骰子,玛莎可以用它们构成从1到x的所有整数。玛莎想知道,对于给定的n个骰子,这个x的最大取值是多少呢?

输入格式:
第一行仅一个整数n,表示骰子的数量(1≤n≤3)。
接下来n行,每行包含6个整数a[i][j](0≤a[i][j]≤9),表示第i个骰子的第j个面上的数字。

输出格式:
输出一个整数,即最大数x,玛莎可以使用她的骰子构成数字从1到x。如果无法构成1,则输出0。

输入样例:

3
0 1 3 5 6 8
1 2 4 5 7 8
2 3 4 6 7 9

输出样例:

98

代码:

#include<stdio.h>
int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
int main(void)
{
	int n, m, flag = 1, a[3][6], judge[1000] = { 0 };

	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 6; j++)
			scanf("%d", &a[i][j]);
		qsort(a[i], 6, sizeof(a[i][0]), cmp);
	}
	m = 0;
	if (n > 0)
		for (int i = 0; i < n; i++)
			for (int j = 0; j < 6; j++) {
				judge[a[i][j]] = 1;
				if (a[i][j] == 1)
					m = 1;
			}
	if (n > 1)
		for (int i = 0; i < n - 1; i++)
			for (int l = i + 1; l < n; l++)
				for (int j = 0; j < 6; j++)
					for (int k = 0; k < 6; k++) {
						judge[a[i][j] * 10 + a[l][k]] = 1;
						judge[a[l][j] * 10 + a[i][k]] = 1;
					}
	if (n > 2)
		for (int x = 0; x < 6; x++)
			for (int y = 0; y < 6; y++)
				for (int z = 0; z < 6; z++) {
					judge[a[0][x] * 100 + a[1][y] * 10 + a[2][z]] = 1;
					judge[a[0][x] * 100 + a[2][z] * 10 + a[1][y]] = 1;
					judge[a[1][x] * 100 + a[0][z] * 10 + a[2][y]] = 1;
					judge[a[1][x] * 100 + a[2][z] * 10 + a[0][y]] = 1;
					judge[a[2][x] * 100 + a[0][z] * 10 + a[1][y]] = 1;
					judge[a[2][x] * 100 + a[1][z] * 10 + a[0][y]] = 1;
				}
	if (m) {
		for (int i = 1; i < 1000; i++)
			if (judge[i] == 0) {
				printf("%d", i - 1);
				break;
			}
	}
	else
		printf("0");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值