模拟,注意细节就可以了。
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 55
char g[N][N];
char mask[N][N];
char str[25];
set<string> se,ans;
int n,m;
string message[4];
int d[4][4] = {
0,1,2,3,
1,2,3,0,
2,3,0,1,
3,0,1,2};
void rotate () {
int i,j;
char tmp[N][N];
for (i = 0;i < n; i++) {
for (j = 0; j < n; j++) {
tmp[i][j] = mask[i][j];
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
mask[j][n-i-1] = tmp[i][j];
}
}
}
string getstring () {
int i,j;
string s;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (mask[i][j] == '*') {
s += g[i][j];
}
}
}
return s;
}
string get(string s) {
string ret;
bool ok = 0;
bool ookk = 0;
int i;
for (i = 0; i < s.length(); i++) {
if (s[i] == '.') {
ok = 1;
}else {
if (ok) {
ok = 0;
if (ookk)
ret += ' ';
}
ret += s[i];
ookk = 1;
}
}
return ret;
}
bool chk(string s) {
int i,j;
string tmp;
for (i = 0; i < s.length(); i++) {
if (s[i] == ' ') {
if (se.find(tmp) == se.end())return false;
tmp.clear();
}
else
tmp += s[i];
}
if (se.find(tmp) == se.end())return false;
return true;
}
void gao () {
int i,j;
//得出4种情况的字符串
for (i = 0; i < 4; i++) {
message[i] = getstring();
rotate();
}
string s;
for (i = 0; i < 4; i++) {
s.clear();
for (j = 0; j < 4; j++) { //以特定的顺序排成新的字符串
s += message[d[i][j]];
}
s = get(s);
if (chk(s)) ans.insert(s);
}
if (ans.size() == 0) puts("FAIL TO DECRYPT");
else cout<<*ans.begin()<<endl;
}
int main () {
int t;
scanf("%d",&t);
int ca = 1;
while (t--) {
se.clear();
ans.clear();
scanf("%d",&n);
int i,j,k;
for (i = 0; i < n; i++) scanf("%s",g[i]);
for (i = 0; i < n; i++) scanf("%s",mask[i]);
scanf("%d",&m);
for (i = 0; i < m; i++) {
scanf("%s",str);
se.insert(str);
}
printf("Case #%d: ",ca++);
gao();
}
return 0;
}