您的位置:首页 > 其它

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;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: