题目:点击打开链接
题意:一个矩阵每个格子有一个字母或者空格,现在有一个Mask旋转四次一定能覆盖所有的空格且不重复。然后Mask初始有四种不同的情况所以会产生四句话。要求输出所有单词都在字典里的那句话,如有多句则输出字典序最小的。
解题思路:由于当时重现赛的时候没有看到只有四个露出的,所以,就代码写的很长,我用的就是完全的暴力 ,仔细看看还是很容易的
#include <bits/stdc++.h>
using namespace std;
char ch[55][55],data[55][55];
char x[105][25];
char ans[2005];
char an[6][2005];
int su=0;
int sum=0;
int n;
void sov1()
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(data[i][j]=='*')
{
if(ch[i][j]=='.')
{
if(ans[su-1]!=' '&&su!=0)
{
ans[su]=' ';
su++;
sum++;
}
}
else
{
ans[su]=ch[i][j];
su++;
}
}
}
}
}
void sov2()
{
for(int j=0; j<n; j++)
{
for(int i=n-1; i>=0; i--)
{
if(data[i][j]=='*')
{
if(ch[j][n-1-i]=='.')
{
if(ans[su-1]!=' '&&su!=0)
{
ans[su]=' ';
su++;
sum++;
}
}
else
{
ans[su]=ch[j][n-1-i];
su++;
}
}
}
}
}
void sov3()
{
for(int i=n-1; i>=0; i--)
{
for(int j=n-1; j>=0; j--)
{
if(data[i][j]=='*')
{
if(ch[n-1-i][n-1-j]=='.')
{
if(ans[su-1]!=' '&&su!=0)
{
ans[su]=' ';
su++;
sum++;
}
}
else
{
ans[su]=ch[n-1-i][n-1-j];
su++;
}
}
}
}
}
void sov4()
{
for(int j=n-1; j>=0; j--)
for(int i=0; i<n; i++)
if(data[i][j]=='*')
{
if(ch[n-1-j][i]=='.')
{
if(ans[su-1]!=' '&&su!=0)
{
ans[su]=' ';
su++;
sum++;
}
}
else
{
ans[su]=ch[n-1-j][i];
su++;
}
}
}
//四个方向露出的
void so()
{
if(ans[su-1]!=' ')
{
sum++;
ans[su]='\0';
su++;
}
else
ans[su-1]='\0';
//su++;
}
int main()
{
int T;
int m;
scanf("%d",&T);
int cas=0;
while(T--)
{
sum=0;
memset(ch,0,sizeof(ch));
memset(data,0,sizeof(data));
memset(x,0,sizeof(x));
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%s",ch[i]);
for(int i=0; i<n; i++)
scanf("%s",data[i]);
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%s",x[i]);
cas++;
printf("Case #%d: ",cas);
su=0;
sum=0;
sov1();
sov2();
sov3();
sov4();
int blog=0;
so();
char tmp[25];
int k=0;
int sa=0;
for(int i=0; i<su; i++)
{
if(ans[i]==' '||i==su-1)
{
tmp[k]='\0';
for(int j=0; j<m; j++)
{
if(strcmp(tmp,x[j])==0)
{
blog++;
break;
}
}
//cout<<tmp<<endl;
k=0;
}
else
{
tmp[k]=ans[i];
k++;
}
}
//cout<<sum<<" "<<blog<<endl;
if(blog==sum)
{
strcpy(an[sa],ans);
sa++;
}
su=0;
sum=0;
sov2();
sov3();
sov4();
sov1();
so();
k=0;
blog=0;
for(int i=0; i<su; i++)
{
if(ans[i]==' '||i==su-1)
{
tmp[k]='\0';
for(int j=0; j<m; j++)
{
if(strcmp(tmp,x[j])==0)
{
blog++;
break;
}
}
k=0;
}
else
{
tmp[k]=ans[i];
k++;
}
}
if(blog==sum)
{
strcpy(an[sa],ans);
sa++;
}
su=0;
sum=0;
sov3();
sov4();
sov1();
sov2();
so();
k=0;
blog=0;
for(int i=0; i<su; i++)
{
if(ans[i]==' '||i==su-1)
{
tmp[k]='\0';
for(int j=0; j<m; j++)
{
if(strcmp(tmp,x[j])==0)
{
blog++;
break;
}
}
k=0;
}
else
{
tmp[k]=ans[i];
k++;
}
}
if(blog==sum)
{
strcpy(an[sa],ans);
sa++;
}
su=0;
sum=0;
sov4();
sov1();
sov2();
sov3();
so();
k=0;
blog=0;
for(int i=0; i<su; i++)
{
if(ans[i]==' '||i==su-1)
{
tmp[k]='\0';
for(int j=0; j<m; j++)
{
if(strcmp(tmp,x[j])==0)
{
blog++;
break;
}
}
k=0;
}
else
{
tmp[k]=ans[i];
k++;
}
}
if(blog==sum)
{
strcpy(an[sa],ans);
sa++;
}
if(sa==0)
printf("FAIL TO DECRYPT\n");
else
{
if(sa==1)
printf("%s\n",an[0]);
else
{
for(int i=1;i<sa;i++)
if(strcmp(an[0],an[i])>0)
strcpy(an[0],an[i]);
printf("%s\n",an[0]);
}
}
}
return 0;
}