这个题目写的有点烦人,总感觉题目没有说清楚,不知道按照字典序是包含头尾空格还是重复空格,后来注意到输出没有多余空格
才去除掉所有多余空格的,总之这个题目在现场的时候敢花时间在这个题目上就能过!
我是按照坐标排序来做的,坐标旋转90度的话(x,y)变成(y,n-y)这里下标从1开始的,n是矩阵维数,也就是第i列变成第i行
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <set>
#include <map>
using namespace std;
#define maxn 200
char message[maxn][maxn];
char mask[maxn][maxn];
struct point{
int x,y;
}po[maxn*maxn];
int n,m,pos;
map<string,int> g;
char str[maxn*maxn],msg1[maxn*maxn],msg2[maxn*maxn],msg3[maxn*maxn],msg4[maxn*maxn];
char now[maxn*maxn*4+10],ans[maxn*maxn*4+10];
bool cmp(const point &a,const point &b){
if(a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
int main(){
int i,j,k=0,t,temp,len;
bool flag,ok;
scanf("%d",&t);
while(t--){
ok=false;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s",message[i]+1);
for(i=1;i<=n;i++)
scanf("%s",mask[i]+1);
g.clear();
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%s",str);
g[str]=1;
}
pos=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(mask[i][j]=='*')
po[pos].x=i,po[pos++].y=j;
sort(po,po+pos,cmp);
for(i=0;i<pos;i++){
if(message[po[i].x][po[i].y]=='.')
msg1[i]=' ';
else
msg1[i]=message[po[i].x][po[i].y];
}
msg1[pos]=0;
for(i=0;i<pos;i++)
temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
sort(po,po+pos,cmp);
for(i=0;i<pos;i++){
if(message[po[i].x][po[i].y]=='.')
msg2[i]=' ';
else
msg2[i]=message[po[i].x][po[i].y];
}
msg2[pos]=0;
for(i=0;i<pos;i++)
temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
sort(po,po+pos,cmp);
for(i=0;i<pos;i++){
if(message[po[i].x][po[i].y]=='.')
msg3[i]=' ';
else
msg3[i]=message[po[i].x][po[i].y];
}
msg3[pos]=0;
for(i=0;i<pos;i++)
temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
sort(po,po+pos,cmp);
for(i=0;i<pos;i++){
if(message[po[i].x][po[i].y]=='.')
msg4[i]=' ';
else
msg4[i]=message[po[i].x][po[i].y];
}
msg4[pos]=0;
//
strcpy(now,msg1),strcpy(now+pos,msg2),strcpy(now+pos+pos,msg3),strcpy(now+pos+pos+pos,msg4);
temp=pos*4;
len=0;
temp--;
while(temp>=0 && now[temp]==' ') temp--;
temp++;
for(i=0;i<temp;i++)
if(now[i]!=' ') break;
for(i;i<temp;i++){
if(now[i]!=' ')
now[len++]=now[i];
else if(now[i-1]!=' ') now[len++]=now[i];
}
now[len]=0;
temp=len;
len=0;
flag=true;
for(i=0;i<temp;i++){
if(now[i]==' '){
str[len]=0;
len=0;
if(g[str]==0) { flag=false;break;}
}
else str[len++]=now[i];
}
str[len]=0;
if(g[str]==0) { flag=false;}
if(flag) strcpy(ans,now),ok=true;
//
strcpy(now,msg2),strcpy(now+pos,msg3),strcpy(now+pos+pos,msg4),strcpy(now+pos+pos+pos,msg1);
temp=pos*4;
len=0;
temp--;
while(temp>=0 && now[temp]==' ') temp--;
temp++;
for(i=0;i<temp;i++)
if(now[i]!=' ')break;
for(i;i<temp;i++){
if(now[i]!=' ')
now[len++]=now[i];
else if(now[i-1]!=' ') now[len++]=now[i];
}
now[len]=0;
temp=len;
len=0;
flag=true;
for(i=0;i<temp;i++){
if(now[i]==' '){
str[len]=0;
len=0;
if(g[str]==0) { flag=false;break;}
}
else str[len++]=now[i];
}
str[len]=0;
if(g[str]==0) { flag=false;}
if(flag==true && ok==false) strcpy(ans,now),ok=true;
else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
strcpy(now,msg3),strcpy(now+pos,msg4),strcpy(now+pos+pos,msg1),strcpy(now+pos+pos+pos,msg2);
temp=pos*4;
len=0;
temp--;
while(temp>=0 && now[temp]==' ') temp--;
temp++;
for(i=0;i<temp;i++)
if(now[i]!=' ')break;
for(i;i<temp;i++){
if(now[i]!=' ')
now[len++]=now[i];
else if(now[i-1]!=' ') now[len++]=now[i];
}
now[len]=0;
temp=len;
len=0;
flag=true;
for(i=0;i<temp;i++){
if(now[i]==' '){
str[len]=0;
len=0;
if(g[str]==0) { flag=false;break;}
}
else str[len++]=now[i];
}
str[len]=0;
if(g[str]==0) { flag=false;}
if(flag==true && ok==false) strcpy(ans,now),ok=true;
else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
//
strcpy(now,msg4),strcpy(now+pos,msg1),strcpy(now+pos+pos,msg2),strcpy(now+pos+pos+pos,msg3);
temp=pos*4;
len=0;
temp--;
while(temp>=0 && now[temp]==' ') temp--;
temp++;
for(i=0;i<temp;i++)
if(now[i]!=' ')break;
for(i;i<temp;i++){
if(now[i]!=' ')
now[len++]=now[i];
else if(now[i-1]!=' ') now[len++]=now[i];
}
now[len]=0;
temp=len;
len=0;
flag=true;
for(i=0;i<temp;i++){
if(now[i]==' '){
str[len]=0;
len=0;
if(g[str]==0) { flag=false;break;}
}
else str[len++]=now[i];
}
str[len]=0;
if(g[str]==0) { flag=false;}
if(flag==true && ok==false) strcpy(ans,now),ok=true;
else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
if(ok) printf("Case #%d: %s\n",++k,ans);
else printf("Case #%d: FAIL TO DECRYPT\n",++k);
}
return 0;
}