#include
typedef int array[10];
array s1,s2,s3;
//函数将时间t(分钟)及t-15转换为长度为伴的数字序列
void stime(int t,int *s)
{
int tt;
tt=t-15;
if(tt<0)
tt+=1440;
//t,tt是2个表的分钟数,tt比t晚15分钟
s[3] = t%10; //分
s[2] = (t/10)/6; //分
s[1] = (t/60)%10; //时
s[0] = t/600; //时
s[7]=tt%10; //分
s[6]=(tt/10)%6; //分
s[5]=(tt/60)%10; //时
s[4]=tt/600; //时
}
//如时间t=500,s[8]={0,8,2,0,0,8,0,5}
short num[10] = {4,55,66,18,49,24,8,54,0,16}; //10个数字的补码
short disp[8];
//将读入的3行数据s1,s2,s3编码
void code(char* s1,char *s2,char *s3)
{
int i,f;
for(i=0;i<8;++i) //8个数字
{
//某个位置不为空格对应位便可设为1
//前一个时间和后一个时间间隔一个空格
f=i/4; //i<4表示前边4个数字,前面没有空格,否则要多一个空格,f表示空格数,
if(s1[i*3+1+f]!=' ') //每个数字占3个位置,左中右,这里是第i个数的中间位置,中间是这一行的惟一有效位置
disp[i]=1; //此4位数的最低位
else
disp[i]=0; //第一行0号LCD管,占中间位置
for(int k=0;k<3;++k) //第二行1,2,3号灯管
if(s2[i*3+k+f]!=" ")
disp[i] |= 1<<(k+1);
for(int k=0;k<3;++k) //第三行4,5,6号灯管
if(s3[i*3+k+f]!=' ')
disp[i] |= 1<<(k+4);
}
}
main()
{
int d,f,t,count,k;
scanf("%d\n",&d)
while(d--)
{
//输入进行编码
gets(s1);
gets(s2);
gets(s3);
code(s1,s2,s3); //对输入图形进行编码,用以与下面的穷举序列进行与运算
for(t=count=0;t<=1440&&count<2;++t)
{
//这个循环遍历每一分钟,count统计可能解的组数
stime(t,s); //时间转换为8个数字
for(k=f=0;k<8&&!f;++k) //检查官个数字是否与输入数据冲突
f=num[s[k]]&disp[k]; //如果数字的补码“与”读入的数据编码结果非0,则不是该数字
if(!f) //f=0表示出个数字与输入数据不冲突,是可能解
{
++count;
for(k=0;k<4;++k)
hms[k]=ss[k];
}
}
//记录该解
//如果有且只有一个时间满足要求,输出该时间
if(count==1)
printf("%d%d%d\n",hms[0],hms[1],hms[2],hms[3]);
else
printf("Not Sure\n");
}
}
阅读(1301) | 评论(0) | 转发(0) |