7 旋转骰子

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

现在玛莎将利用这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<bits/stdc++.h>
using namespace std;
int f(int num){
	int sum=0;
	while(num){
		sum++;
		num/=10;
	}
	return sum;
}
int main(){
	int n;cin>>n;
	int a[n][6];
	int flag=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<6;j++){
			cin>>a[i][j];
			if(a[i][j]==1){
				flag=1;
			}
		}
	}
	if(!flag){//特判1 
		cout<<0;
		return 0;
	}
	//循环数字 看是否能由骰子组成
	int num=2;
	while(1){
		int t=num,t1=num;
		int matrix[n]={0};//n个骰子是否出现过数字 
		int sum=0;
		while(t){//对数字每位数判断 
			int val=t%10;//数字的每位数
			//cout<<val<<" ";//***********
			for(int i=0;i<n;i++){//找每个骰子 
				if(matrix[i]==1){//如果被访问过跳过
					continue;
				}
				for(int j=0;j<6;j++){
					if(a[i][j]==val){
						//cout<<a[i][j]<<" ";//**************
						//cout<<i<<" ";//**************
						matrix[i]=1;//标记已访问过 
						sum++;
						break;
					}
				}//没找到数字则找下一个骰子 
				if(matrix[i]==1)	break;//找到了当前数字val 
			}
			t/=10;
		}
		//cout<<endl;//*******************
		if(sum!=f(num)){//数字的每位数有找不到的,反着找一遍 
			memset(matrix,0,sizeof(matrix));
			sum=0;
			while(t1){
				int val=t1%10;
				for(int i=n-1;i>=0;i--){//****
					if(matrix[i]==1){
						continue;
					}
					for(int j=0;j<6;j++){
						if(a[i][j]==val){
							matrix[i]=1;
							sum++;
							break;
						}
					}
					if(matrix[i]==1)	break;
				}
				t1/=10;
			}
		}
		if(sum!=f(num))	break; 
		else	num++;//继续循环 
	}
	cout<<--num;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值