哎 自己真是弱爆了,模拟题都搞不定。。
少了一个语句,回来加上就A了
太遗憾了
#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int N,M;
char W[55][55];
int mask[5000][2],nmask;
char Result[5000];
set<string> dic;
vector<string> stringR;
vector<string> best;
int cmp(const void *a,const void *b)
{
if(((int*)a)[0] == ((int*)b)[0])
return ((int*)a)[1] - ((int*)b)[1];
return ((int*)a)[0] - ((int*)b)[0];
}
void rota()
{
int i;
for (i=0;i<nmask;++i)
{
int a,b;
a=mask[i][0];
b=mask[i][1];
mask[i][0]=b;
mask[i][1]=N-1-a;
}
qsort(mask,nmask,sizeof(mask[0]),cmp);
}
bool isLeg()
{
int i;
for (i=0;i<stringR.size();++i)
{
if (dic.find(stringR[i])==dic.end())
{
return false;
}
}
return true;
}
void getstring()
{
int i;
memset(Result,0,sizeof(Result));
for (i=0;i<nmask;++i)
{
Result[i]=W[mask[i][0]][mask[i][1]];
}
rota();
for (i=0;i<nmask;++i)
{
Result[i+nmask]=W[mask[i][0]][mask[i][1]];
}
rota();
for (i=0;i<nmask;++i)
{
Result[i+2*nmask]=W[mask[i][0]][mask[i][1]];
}
rota();
for (i=0;i<nmask;++i)
{
Result[i+3*nmask]=W[mask[i][0]][mask[i][1]];
}
//printf("%s\n",Result);
string s="";
stringR.clear();
for (i=0;i<4*nmask;++i)
{
if (Result[i]=='.')
{
if (s!="")
{
stringR.push_back(s);
s="";
}
}else
s+=Result[i];
}
if (s!="")
{
stringR.push_back(s);
}
}
bool isbetter()
{
int i;
if (best.size()==0 && stringR.size()!=0) return true;
for (i=0;i<stringR.size() && i<best.size() ;++i)
{
if (stringR[i]<best[i]) return true;//就是少了 这一句啊!!!!结束后两分钟发现了
if (stringR[i]>best[i]) return false;
}
if (stringR.size() <best.size())
{
return true;
}
return false;
}
void work()
{
getstring();
if(isLeg())
{
best=stringR;
}
rota();
rota();
getstring();
if(isLeg())
{
if (isbetter()) best=stringR;
}
rota();
rota();
getstring();
if(isLeg())
{
if (isbetter()) best=stringR;
}
rota();
rota();
getstring();
if(isLeg())
{
if (isbetter()) best=stringR;
}
}
int main()
{
int T,i,j,k,t,nDic;
cin>>T;
for (t=1;t<=T;++t)
{
cin>>N;
for (i=0;i<N;++i)
{
for (j=0;j<N;++j)
{
cin>>W[i][j];
}
}
nmask=0;
for (i=0;i<N;++i)
{
for (j=0;j<N;++j)
{
char c;
cin>>c;
if (c=='*')
{
mask[nmask][0]=i;
mask[nmask][1]=j;
nmask++;
}
}
}
cin>>nDic;
dic.clear();
for (i=0;i<nDic;++i)
{
string s;
cin>>s;
dic.insert(s);
}
best.clear();
work();
cout<<"Case #"<<t<<":";
if (best.size()==0)
{
cout<<" FAIL TO DECRYPT"<<endl;
}else
{
for (i=0;i<best.size();++i)
{
cout<<" "<<best[i];
}
cout<<endl;
}
}
return 0;
}