poj1676 What time is it?

来源:互联网 发布:2010年东决詹姆斯数据 编辑:程序博客网 时间:2024/05/01 21:55
//这一题真是耗尽了脑汁也找不出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;}*/

原创粉丝点击