poj1676 What time is it?
2012-05-01 17:12
387 查看
//这一题真是耗尽了脑汁也找不出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] ); 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; } */
相关文章推荐
- poj 1676 What time is it?(经典模拟)
- poj 1676 What time is it?
- What is pseudopolynomial time? How does it differ from polynomial time?
- what time is it?
- poj 1676 What time is it?
- Problem 45 What Time Is It
- POJ 1676 What time is it? 笔记
- [翻译Joel On Software] “现在几点了”网站功能规范/WhatTimeIsIt.com Functional Specification
- poj 1676-What time is it?
- WhatTimeIsIt .com
- Poj 1676 What time is it?
- What is SAP HANA and its architecture
- WHAT IS ISO? A CAMERA’S SENSITIVITY TO LIGHT EXPLAINED, AND HOW TO USE IT
- 【hdu2133】What day is it
- CareerCup What is the difference between a computers heap and it's stack?
- zoj 1256 What Day Is It?
- HDOJ 2133 What day is it
- What is "found.000" ? How to deal with it?
- do{...}while(0)what is it good for?
- What is reflection and how to use it in CSharp ?