//这一题真是耗尽了脑汁也找不出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;}*/