PTA旋转骰子
题目描述
玛莎有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
思路
- 建立一个二维数组
a[][10]
,a[i][j]>=1
表示第i个骰子至少存在一个数字j。 - 从1到9,检查三个骰子是否具有1-9之间的数字
- 从10到99,检查三个骰子是否具有10-99之间的数字
- 从100到999,检查三个骰子是否具有100-999之间的数字?
- 实际上不必去检查100到999,因为要如果要经过99必先经过88,77,66,55,44,33,22,11,10,19,而这样已经至少需要18个数字,而3个骰子最多能够承载18个数字。
代码
#include<iostream>
#include<stdio.h>
#include<string.h>
int a[3][10];
using namespace std;
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));
int x;
int flag_1=0;
for( int i=0;i<n;i++)
{
for( int j=0;j<6;j++)
{
cin>>x;
if(x==1)flag_1=1;
a[i][x]++;
}
}
if(flag_1==0)
{
cout<<0;
return 0;
}
for( int i=1;i<=9;i++)
{
int flag=0;
for( int j=0;j<n;j++)
{
if(a[j][i]>=1)
{
flag=1;
break;
}
}
if(!flag)
{
cout<<i-1;
return 0;
}
}
for( int i=10;i<=99;i++)
{
int x=i/10;
int y=i%10;
int flag=0;
for( int j=0;j<n;j++)
{
for( int k=j+1;k<n;k++)
{
if((a[j][x]>=1&&a[k][y]>=1)||(a[k][x]>=1&&a[j][y]>=1))
{
flag=1;
goto action2;
}
}
}
cout<<i-1;
return 0;
action2: ;
}
return 0;
}