题目地址:2011_Chengdu_I
题目大意: 先给你一个矩阵,然后给你一个“mask”,里面n*n/4 个hole ,把它放在这个矩阵上,hole的地方会形成一个striing,现在把这个mask顺时针旋转90度,得到第二个string,然后。。直到得到4个string,但是不知道哪个打头,这样就有4中可能,需要一一枚举。
然后给你了一个单词表 ,我们放进一个set,用count查询。
得到每个可能的信息串后,要将它拆成一个个的单词,为了方斌拆分,在最后加一个’.‘ ;
刚刚开一个p[50][50] 会re 干脆数组都开大一点
代码比较长,模拟。。
代码:
#include<iostream>
#include<set>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
char p[55][55];
bool hole[55][55];
bool hole1[55][55];
bool hole2[55][55];
bool hole3[55][55];
int x[1000];
int y[1000];
int x1[1000];
int y1[1000];
int x2[1000];
int y2[1000];
int x3[1000];
int y3[1000];
void init()
{
memset(hole,0,sizeof(hole));
memset(hole1,0,sizeof(hole1));
memset(hole2,0,sizeof(hole2));
memset(hole3,0,sizeof(hole3));
}
int main()
{
int cas;
cin>>cas;
for(int l=0;l<cas;l++)
{
init();
int index=0;
set<string> vocabulary;
int n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%s",p[i]);
char ch;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ch;
if(ch=='*')
{
x[index]=i;
y[index]=j;
index++;
}
}
int words_num;
cin>>words_num;
string s;
for(int i=0;i<words_num;i++)
{
cin>>s;
vocabulary.insert(s);
}
// 90
for(int i=0;i<index;i++)
{
x1[i]=y[i];
y1[i]=n-1-x[i];
}
// 180
for(int i=0;i<index;i++)
{
x2[i]=n-1-x[i];
y2[i]=n-1-y[i];
}
// 270
for(int i=0;i<index;i++)
{
x3[i]=n-1-y[i];
y3[i]=x[i];
}
string w="",w1="",w2="",w3="";
for(int i=0;i<index;i++)
{
hole[x[i]][y[i]]=1;
hole1[x1[i]][y1[i]]=1;
hole2[x2[i]][y2[i]]=1;
hole3[x3[i]][y3[i]]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(hole[i][j]==1) w+=p[i][j];
if(hole1[i][j]==1) w1+=p[i][j];
if(hole2[i][j]==1) w2+=p[i][j];
if(hole3[i][j]==1) w3+=p[i][j];
}
string ans[4];
ans[0]=w+w1+w2+w3+'.';
ans[1]=w1+w2+w3+w+'.';
ans[2]=w2+w3+w+w1+'.';
ans[3]=w3+w+w1+w2+'.';
vector<string> words_in_ans[4]; // 保存拆分后的单词
int length=ans[0].length();
string cur="";
// 放进相应单词序列中
for(int k=0;k<4;k++)
for(int i=0;i<length;i++)
{
if(ans[k][i]=='.')
{
if(cur!="") words_in_ans[k].push_back(cur);
cur="";
}
else cur+=ans[k][i];
}
bool valid[4];
for(int i=0;i<4;i++)
valid[i]=1;
for(int k=0;k<4;k++)
for(int i=0;i<words_in_ans[k].size();i++)
{
if(vocabulary.count(words_in_ans[k][i])==0) {
valid[k]=0;
break;
}
}
vector<string> final_ans;
vector<string> sort_assist; // 用于辅助排序
vector<int> id; // 因为要用words_in_ans[k] 进行输出,所以比出来以后还要 找出0-3中是哪个id
for(int k=0;k<4;k++)
{
if(valid[k])
{
final_ans.push_back(ans[k]);
string s="";
for(int i=0;i<words_in_ans[k].size();i++)
s+=words_in_ans[k][i];
sort_assist.push_back(s);
id.push_back(k);
}
}
int ans_size=final_ans.size();
if(ans_size==0)
cout<<"Case #"<<l+1<<": "<<"FAIL TO DECRYPT"<<endl;
else if(ans_size==0)
{
cout<<"Case #"<<l+1<<":";
for(int i=0;i<words_in_ans[0].size();i++)
{
cout<<" "<<words_in_ans[0][i];
}
cout<<endl;
}
else
{
int min_index=0;
string min_ans=sort_assist[0];
for(int i=0;i<ans_size;i++)
{
if(sort_assist[i]<min_ans)
{
min_index=i;
min_ans=sort_assist[i];
}
}
int ans_index=id[min_index];
cout<<"Case #"<<l+1<<":";
for(int i=0;i<words_in_ans[ans_index].size();i++)
{
cout<<" "<<words_in_ans[ans_index][i];
}
cout<<endl;
}
}
}