Title

PTA旋转骰子

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;
}
posted @ 2021-03-12 14:17  BeautifulWater  阅读(156)  评论(0编辑  收藏  举报