<p>#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
string mb[10];//模板
int next[10]={9,0,1,2,3,4,5,6,7,8};//记录当前数字的下一个数字
/*返回某个字符串与k模板是否匹配*/
bool danm(string a,int z[],int k)//k是开始,m最多几次
{
for(int j=0;j<7;j++)
{
if((a[j]=='0'&&mb[k][j]=='1'&&z[j]==1)||(a[j]=='1'&&mb[k][j]=='0'))
{
return false;
}
}
return true;
}
int main()
{</p><p>mb[0]="1111110";
mb[1]="0110000";
mb[2]="1101101";
mb[3]="1111001";
mb[4]="0110011";
mb[5]="1011011";
mb[6]="1011111";
mb[7]="1110000";
mb[8]="1111111";
mb[9]="1111011";
freopen("D:\\A-small-practice.in","r",stdin);
freopen("D:\\A-small-practice.out","w",stdout);
/******************************************/
int T;
cin>>T;
int id=1;
while(T--)
{
int kh[7];//记录可能坏的板子其中1表示不能坏,0表示可以坏
memset(kh,0,sizeof(kh));
int n,i,j;
cin>>n;
vector<string> s;
while(n--)
{
string temp;
cin>>temp;
s.push_back(temp);
}
for(i=0;i<s.size();i++)
{
for(j=0;j<7;j++)
{
if(s[i][j]=='1')//如果板子可坏则为'0'
kh[j]=1;
}
}
// for(i=0;i<7;i++)
// cout<<kh[i]<<" ";
// cout<<endl;
int ks=-1;
vector<int> shou;//记录第一个字符串可能与那几个数相匹配
for(i=0;i<10;i++)
if(danm(s[0],kh,i))//如果匹配则加入
shou.push_back(i);
int d=0;
if(shou.size()>0)//如果有匹配的则初始化ks
{
ks=shou[d];
i=1;
}
/*
第一个字符串如果和某个数字匹配,则看下一个是否和下一个数匹配,如果匹配则继续往下走直到走完所有的字符串
如果不匹配则跳到第一个字符串,选择第一个字符串的另一个可能继续走如果还不行,第一个没有可能了,则error
*/
while(ks!=-1&&i<s.size())//
{
if(danm(s[i],kh,next[ks]))//如果下一个是当前数的后一个
{
ks=next[ks];
i++;
}
else//如果不是则找s[0]的下一个可能
{
d++;
if(d<shou.size())
{
ks=shou[d];
i=1;
}
else ks=-1;
}
}
cout<<"Case #"<<id<<": ";
if(ks!=-1)
{
int r[7]={0,0,0,0,0,0,0};
for(i=0;i<7;i++)
{
if(kh[i]==1&&mb[next[ks]][i]=='1')
r[i]=1;
}
cout<<next[ks]<<":";
for(i=0;i<7;i++)
cout<<r[i];
cout<<endl;
}
else cout<<"ERROR!"<<endl;
// int fan=danm(s[0],kh,0);
// cout<<fan<<endl;</p><p> id++;
}
fclose(stdin);
fclose(stdout);
return 1;
}</p>
这样没过,因为我怀疑他的问题有问题,我先把我的思路写一下,
出错的电子板只能是不为1的位置。
第一个字符串如果和某个数字匹配,则看下一个是否和下一个数匹配,如果匹配则继续往下走直到走完所有的字符串
如果不匹配则跳到第一个字符串,选择第一个字符串的另一个可能继续走如果还不行,第一个没有可能了,则error