poj1676 What time is it?

//这一题真是耗尽了脑汁也找不出WA在哪!?(好打击人的一题) 
//我的思路是:将输入的LED时钟还原为数字,然后再一一进行匹配,过程可以进行一些剪枝操作(例如第一个数字不可以大于2,第三个数字不可以大于6)
//得出了第一个时钟的正确时间,然后再减去15分钟,得出第二个时钟的时间,再在第二个时钟的字符串中寻找是否存在着这些数字,如果存在,匹配数就加1
//到最后如果匹配数大于1又或者为0,就输出not sure,否则就输出正确的时间! 
//写出来的代码好恶心,自己都不想看,以后要尽量改进,做到有条理性才可以!(自己的代码,下面的数据全过了,但提交上去就WA,另附别人的代码) 
#include "iostream"
#include "string"
using namespace std;

struct Info
{
    string up;
    string mid;
    string down;
    int num;
}digit[10];

string num[9];
string ans;
int c;
string solve(string str);
int find_digit(string str, string str1);

int main()
{
    //LED上的时间用字符串表示! 
    digit[0].up = " _ ", digit[0].mid = "| |", digit[0].down = "|_|", digit[0].num = 0;
    digit[1].up = "   ", digit[1].mid = "  |", digit[1].down = "  |", digit[1].num = 1;
    digit[2].up = " _ ", digit[2].mid = " _|", digit[2].down = "|_ ", digit[2].num = 2;
    digit[3].up = " _ ", digit[3].mid = " _|", digit[3].down = " _|", digit[3].num = 3;
    digit[4].up = "   ", digit[4].mid = "|_|", digit[4].down = "  |", digit[4].num = 4;
    digit[5].up = " _ ", digit[5].mid = "|_ ", digit[5].down = " _|", digit[5].num = 5;
    digit[6].up = " _ ", digit[6].mid = "|_ ", digit[6].down = "|_|", digit[6].num = 6;
    digit[7].up = " _ ", digit[7].mid = "  |", digit[7].down = "  |", digit[7].num = 7;
    digit[8].up = " _ ", digit[8].mid = "|_|", digit[8].down = "|_|", digit[8].num = 8;
    digit[9].up = " _ ", digit[9].mid = "|_|", digit[9].down = " _|", digit[9].num = 9;
    
    int tc, i, j, k, m, n, q;
    cin >> tc;
    cin.get();
    Info input;
    string str[3];
    string first[4], secoend[4];
    int a[3][3];
    while (tc--)
    {
          c = 0;
          ans = "";
          for (i = 0; i < 3; i++)
               str[i].clear();
          for (i = 0; i < 3; i++)
               getline(cin, str[i]);
          for (i = 0; i < 9; i++)
               num[i].clear();
          for (i = 0; i < 9; i++)//将输入的字符串分离出一个个数字来! 
          {
              if (i == 4 ) continue;
              input.up.clear();
              input.mid.clear();
              input.down.clear();
              if (i < 4)
              {
                  for (j = i* 3; j < 3*(i+1); j++)
                  {
                      input.up += str[0][j];
                      input.mid += str[1][j];
                      input.down += str[2][j];    
                  }
              }
              if (i > 4)
              {
                  for (j = (i - 1)* 3 + 1; j <= 3*i; j++)
                  {
                      input.up += str[0][j];
                      input.mid += str[1][j];
                      input.down += str[2][j];    
                  }
              }
              
              for (j = 0; j < 3; j++)
                 for(k = 0; k < 3; k++)
                     a[j][k] = 0;
              for (k = 0; k < 3; k++)//通过位置上有无字符串进行匹配!如果是空格的就跳过,否则进行字符的匹配 
              {
                 if (input.up[k] == ' ')
                    continue;
                 else
                 {
                     a[0][k] = 1;
                 }
              }
              for (k = 0; k < 3; k++)
              {
                 if (input.mid[k] == ' ')
                    continue;
                 else
                 {
                     a[1][k] = 1;
                 }
              }
              for (k = 0; k < 3; k++)
              {
                 if (input.down[k] == ' ')
                    continue;
                 else
                 {
                     a[2][k] = 1;
                 }
              }
              
              for (j = 0; j < 10; j++)//将字符图形转换为数字的形式表示! 
              {
                  bool upflag = true, midflag = true, downflag = true;
                  for (k = 0; k < 3; k++)
                     for (m = 0; m < 3; m++)
                     {
                         if (a[k][m] != 0)
                         {
                             if (k == 0 && digit[j].up[m] != input.up[m])
                                upflag = false;
                             if (k == 1 && digit[j].mid[m] != input.mid[m])
                                midflag = false;
                             if (k == 2 && digit[j].down[m] != input.down[m])
                                downflag = false;
                         }
                     }
                     if (upflag && midflag && downflag)
                           num[i] += (digit[j].num + 48);
              }
              if (i == 0)
              {
                    string temp;
                    int len = num[0].length();
                    for (j = 0; j < len; j++)
                    {
                        if (num[0][j] < '3')
                            temp.push_back(num[0][j]);
                    }
                    num[0].clear();
                    num[0] += temp;
              }
              if (i == 2)
              {
                    string temp;
                    int len = num[2].length();
                    for (j = 0; j < len; j++)
                    {
                        if (num[2][j] < '6')
                            temp.push_back(num[2][j]);
                    }
                    num[2].clear();
                    num[2] += temp;
              }
          }
          
          bool ff = false;
          for (i = 0; i < num[0].length(); i++)//进行一一的字符——数字匹配! 
          {
              if (ff) break;
             for (j = 0; j < num[1].length(); j++)
             {
                 if (ff) break;
                for (m = 0; m < num[2].length(); m++)
                {
                    if (ff) break;
                   for (n = 0; n < num[3].length(); n++)
                   {
                       string first = "", second = "";
                       first.push_back(num[0][i]);
                       first.push_back(num[1][j]);
                       first.push_back(num[2][m]);
                       first.push_back(num[3][n]);
                       second = solve(first);
                       int aa = find_digit(second, first);
                       if (aa > 1)
                       {
                          ff = true;
                          cout << "Not Sure" << endl;
                          break;
                       }
                   }
                }
             }
          }
            
          if (c == 0)
             cout << "Not Sure" << endl;       
          if (c == 1)
              cout << ans << endl;
    }
}

string solve(string str)//由正确的时间计算出第二个表的时间! 
{
       int temp1, temp2, temp3, temp4;
       string temp = "";
       temp1 = str[3] - 48;
       temp2 = str[2] - 48;
       temp3 = str[1] - 48;
       temp4 = str[0] - 48;
       if (temp1 < 5)
       {
           temp1 += 10;
           temp1 -= 5;
           temp2 -= 1;
       }
       else 
           temp1 -= 5;
       if (temp2 < 1)
       {
           temp2 += 6;
           temp2 -= 1;
           temp3 -= 1;
       }
       else
           temp2 -= 1;
       if (temp3 < 0)
       {
          if (temp4 == 1 || temp4 == 2)
          {
              temp3 += 10;
              temp4 -= 1;
          }
          else if (temp4 == 0)
          {
              temp3 += 4;
              temp4 = 2;
          }
       }
       temp.push_back(temp4+48);
       temp.push_back(temp3+48);
       temp.push_back(temp2+48);
       temp.push_back(temp1+48);
       
       return temp;
}

int find_digit(string str, string str1)//再第二个时间的字符串中寻找是否存在这样的数字,如果存在就匹配个数加1! 
{
     bool flag1 = false, flag2 = false, flag3 = false, flag4 = false;
     int  i;
     for (i = 0; i < num[5].length(); i++)
     {
         if (str[0] == num[5][i])
         {
             flag1 = true;
             break;
         }
     }
     for (i = 0; i < num[6].length(); i++)
     {
         if (str[1] == num[6][i])
         {
             flag2 = true;
             break;
         }
     }
     for (i = 0; i < num[7].length(); i++)
     {
         if (str[2] == num[7][i])
         {
             flag3 = true;
             break;
         }
     }
     for (i = 0; i < num[8].length(); i++)
     {
         if (str[3] == num[8][i])
         {
             flag4 = true;
             break;
         }
     }
     if (flag1 && flag2 && flag3 && flag4)
     {
         c++;
         ans = str1;
     }
     return c;
}


/*
    _  _  _      _     _ 
  | _  _||       _   ||  
  | _ |_   |   | _    |_|
    _  _  _   _  _     _ 
  ||_  _||       _|  ||  
  | _ |_   |   ||     |_|
    _  _  _      _     _ 
  |     ||           ||  
  | _ |_   |   | _    |_|
    _  _  _   _  _     _ 
  ||    ||       _|  ||  
  | _ |_   |   ||     |_|
    _  _  _   _  _     _ 
  ||_  _||       _|  ||  
  | _ |_   |   ||      _|
 _  _  _  _   _  _     _ 
| || || || |  _| _||_||_ 
|_||_||_||_| |_  _|  | _|
                 _  _  _ 
  |  |  |  |   || ||_ |_|
| | _|  |  |   ||_| _||_|
    _  _  _      _     _ 
  | _  _||       _   ||  
  | _ |_   |   | _    |_|
    _  _  _   _  _     _ 
  ||_  _||       _|  ||  
  | _ |_   |   ||     |_|
 _  _  _      _  _     _ 
| || || |  |  _| _||_||_ 
|_||_||_|  | |_  _|  ||_|
 _  _  _  _   _  _  _  _ 
|_||_||_||_| |_||_||_||_|
|_||_||_||_| |_||_||_||_|
 _  _  _  _      _     _ 
| || || || |     _||_||_ 
|_||_||_||_|     _|  | _|
 _  _     _   _  _     _ 
| || |  || |  _| _||_ |_ 
|_||_|  ||_| |_  _|  | _|
 _  _  _  _   _  _     _ 
| || |  || |  _| _||_ |_ 
|_||_|  ||_| |_  _|  | _|
 _  _     _   _  _  _  _ 
| || |  || |  _| _||_ |_ 
|_||_|  ||_| |_  _| _| _|
 _  _     _   _  _  _  _ 
| || |  || |  _| _||_ | | 
|_||_|  ||_| |_  _| _||_|
*/


/*
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int const num[15]={119,36,93,109,46,107,123,37,127,111};
int a[5],b[5],now[5][15],bef[5][15],t1[2][100],t2[2][100];
int nowcnt[5],befcnt[5],t1cnt[2],t2cnt[2];
char str[4][30];
void add(char a,char b,char c,int &o,int x,int y,int z)//计算该行所表示的o的权 
{
	if (a!=' ')
		o+=(1<<x);
	if (b!=' ')
		o+=(1<<y);
	if (c!=' ')
		o+=(1<<z); 
}
int PossiNum(int a,int A[])//将残缺的LED所可能的数字找出来 
{
	int cnt=0,i;
	for (int i=0;i<10;i++)
		if (((a&num[i])|(a^num[i]))==num[i])
			A[cnt++]=i;
	return cnt;
}
void PossiTime(int x[5][15],int y[2][100],int xlen[],int ylen[])//将所有的小时,分钟存入数组y 
{
	int i,j,h,m;
	for (i=0;i<xlen[0];i++)
		for (j=0;j<xlen[1];j++){
			h=x[0][i]*10+x[1][j];
			if (h<24)
				y[0][ylen[0]++]=h;
		}
	for (i=0;i<xlen[2];i++)
		for (j=0;j<xlen[3];j++){
			m=x[2][i]*10+x[3][j];
			if (m<59)
				y[1][ylen[1]++]=m;
		}
}
bool Accurate(int &h,int &m)//计算是否存在唯一可能 
{
	int i,j,p,q,cnt=0,h1,m1,h2,m2;
	memset(t1cnt,0,sizeof(t1cnt));
	memset(t2cnt,0,sizeof(t2cnt));
	PossiTime(now,t1,nowcnt,t1cnt);
	PossiTime(bef,t2,befcnt,t2cnt);
	for (i=0;i<t2cnt[0]&&cnt<2;i++)//第二个钟 
		for (j=0;j<t2cnt[1]&&cnt<2;j++){
			m2=t2[1][j]+15;
			h2=t2[0][i];
			if (m2>59){//处理进位 
				h2++;
				m2%=60;
			}
			if (h2>23)//最开始写成24了,wa一次 
				h2=0;
			for (p=0;p<t1cnt[0]&&cnt<2;p++)
				for (q=0;q<t1cnt[1]&&cnt<2;q++){
					m1=t1[1][q];
					h1=t1[0][p];
					if (h1==h2&&m1==m2){//比较是否相等 
						cnt++;
						h=h1,m=m1;
						if (cnt>=2)
							return 0;
					}
				}
		}
	if (cnt==1)
		return 1;
	return 0;
}
void slove()
{
	int i,j,h,m;
	for (i=0;i<5;i++)
		a[i]=b[i]=0;
	for (i=1;i<12;i+=3)//计算出两个钟,八个数字的权值 
		if (str[0][i]!=' ')
			a[i/3]+=1;
	for (++i;i<25;i+=3)
		if (str[0][i]!=' ')
			b[(i/3)%4]+=1;	
	for (i=0;i<12;i+=3)
		add(str[1][i],str[1][i+1],str[1][i+2],a[i/3],1,3,2); 
	for (++i;i<25;i+=3)
		add(str[1][i],str[1][i+1],str[1][i+2],b[(i/3)%4],1,3,2); 
	for (i=0;i<12;i+=3)
		add(str[2][i],str[2][i+1],str[2][i+2],a[i/3],4,6,5); 
	for (++i;i<25;i+=3)
		add(str[2][i],str[2][i+1],str[2][i+2],b[(i/3)%4],4,6,5); 
	for (i=0;i<4;i++){
		nowcnt[i]=PossiNum(a[i],now[i]);
		befcnt[i]=PossiNum(b[i],bef[i]);
	}
	if (!Accurate(h,m))
		printf("Not Sure\n");
	else {
		if (h/10==0)
			printf("0");
		printf("%d",h);
		if (m/10==0)
			printf("0");
		printf("%d\n",m); 
	}
}

int main()
{
	int t,i;
	scanf("%d",&t);
	getchar();
	while (t--){
		for (i=0;i<3;i++)
			gets(str[i]);
		slove();
	}
	return 0;
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值