题意描述起来略麻烦,就不说了。模拟题。
WA了一个下午。。。。当时都有点想放弃了。总的来说 还是很爽的
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct dian{
int r,c;
}point[100005];
char dic[105][25];
struct final{
char data[100005];
int num;
}sorted[10];
bool cmpsorted(final a,final b)
{
return strcmp(a.data,b.data)<0;
}
bool cmp(dian a,dian b)
{
if(a.r!=b.r)
return a.r<b.r;
else
return a.c<b.c;
}
int main()
{
// freopen("11.txt","rt",stdin);
// freopen("out.txt","wt",stdout);
int t,cas=1;
scanf("%d",&t);
while(t--)
{
int n,i,j,k;
for(i=0;i<4;i++)
{ sorted[i].data[0]='\0'; sorted[i].num=i ; }
scanf("%d",&n);
getchar();
char map[55][55];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='.')
map[i][j]=' ';
}
getchar();
}
int pointnum=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
char c=getchar();
if(c=='*')
{ point[pointnum].r=i; point[pointnum++].c=j ; }
}
getchar();
}
int dicnum;
scanf("%d",&dicnum);
for(i=0;i<dicnum;i++)
scanf("%s",dic[i]);
char rec[5][100005];
for(k=0;k<4;k++)
{
int len=0;
for(j=0;j<4;j++)
{
for(i=0;i<pointnum;i++)
{
rec[k][len++]=map[point[i].r][point[i].c];
int t=point[i].r;
point[i].r=point[i].c;
point[i].c=n-1-t;
}
sort(point,point+pointnum,cmp);
}
rec[k][len]='\0';
for(i=0;i<pointnum;i++){
int t=point[i].r;
point[i].r=point[i].c;
point[i].c=n-1-t;
}
sort(point,point+pointnum,cmp);
}
// for(i=0;i<4;i++)
// printf("%s\n",rec[i]);
int legal[10];
for(i=0;i<4;i++)
legal[i]=1;
for(i=0;i<4;i++)
{
int begin=0,last;
int len=strlen(rec[i]);//也可以在rec[i]的后面加一个空格字符,这样后面可以统一处理
for(j=0;j<len;j++)
{
if(j==len-1&&rec[i][j]!=' ')//一开始WA的原因是写了句if(j==len-1||rec[i][j]==' ')本来想
{ //处理最后一位的,后来发现如果最后一位是空格的话,在sorted里面会多记录一个空格
last=j;
if(begin<=last)
{
char temp[10005];
int lt=0;
for(k=begin;k<=last;k++)
temp[lt++]=rec[i][k];
temp[lt]='\0';
int x=strlen(sorted[i].data);
if(!x)
strcat(sorted[i].data,temp);
else
{
sorted[i].data[x]=' ';
sorted[i].data[x+1]='\0';
strcat(sorted[i].data,temp);
}
int found=0;
for(k=0;k<dicnum;k++){
if(strcmp(dic[k],temp)==0)
found=1;
}
if(!found)
{ legal[i]=0; break; }
}
}
else if(rec[i][j]==' ')
{
last=j-1;
if(begin<=last)
{
char temp[10005];
int lt=0;
for(k=begin;k<=last;k++)
temp[lt++]=rec[i][k];
temp[lt]='\0';
int x=strlen(sorted[i].data);
if(!x)
strcat(sorted[i].data,temp);
else
{
sorted[i].data[x]=' ';
sorted[i].data[x+1]='\0';
strcat(sorted[i].data,temp);
}
int found=0;
for(k=0;k<dicnum;k++){
if(strcmp(dic[k],temp)==0)
found=1;
}
if(!found)
{ legal[i]=0; break; }
}
begin=j+1;
}
}
}//for
sort(sorted,sorted+4,cmpsorted);
int is_print=0;
printf("Case #%d: ",cas++);
for(i=0;i<4;i++)
{
if(legal[sorted[i].num]&&strlen(sorted[i].data))
{
printf("%s\n",sorted[i].data);
is_print=1;
break;
}
}
if(!is_print)
printf("FAIL TO DECRYPT\n");
}
return 0;
}