题目大意:给出一个N*N的矩阵,上面有些空格写有字母有些为空格, 现在给你一张N*N解密的卡片(卡片上面有N*N/4个洞),现在把卡片放在有字的矩阵上(初始方向不定),通过洞可以看到字母, 然后旋转卡片90度,又可以看见新的字母(直到旋转3次停止旋转), 现在要求你解密出密文。
思路:模拟.............
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n = 0, m = 0, cnt = 0;
char m1[52][52], m2[52][52], m3[102][22], m4[10][2600];
char a1[3002], a2[3002];
struct node
{
int x, y;
}num[1002];
int cmp(const void *a, const void *b)
{
char *c = (char *)a;
char *d = (char *)b;
return strcmp(c, d);
}
int cmp1(const void *a, const void *b)
{
node * c = (node *)a;
node *d = (node *)b;
if(c->x != d->x) return c->x - d->x;
return c->y - d->y;
}
void input(char m[52][52])
{
int i = 0, j = 0;
for(i = 1; i<=n; i++)
{
for(j = 1; j<=n; j++)
{
scanf("%c", &m[i][j]);
if(m[i][j] == '*')
num[cnt].x = i, num[cnt++].y = j;
}
getchar();
}
}
void rotate()
{
int i = 0, t = 0;
for(i = 0; i<cnt; i++)
{
t = num[i].x;
num[i].x = num[i].y;
num[i].y = n-t+1;
}
qsort(num, cnt, sizeof(num[0]), cmp1);
}
int binary(char *a)
{
int x = 0, y = m-1;
while(x<=y)
{
int m = x+(y-x)/2;
if(strcmp(m3[m], a) == 0) return 1;
else if(strcmp(m3[m], a) < 0) x = m+1;
else y = m-1;
}
return 0;
}
int main()
{
int i = 0, j = 0, k = 0, t = 0, flag = 0;
int c1 = 0, c2 = 0, c3 = 1;
scanf("%d", &t);
while(t--)
{
cnt = k = c1 = c2 = 0;
scanf("%d", &n);
getchar();
input(m1);
input(m2);
scanf("%d", &m);
for(i = 0; i<m; i++)
scanf("%s", m3[i]);
qsort(m3, m, sizeof(m3[0]), cmp);//对认识的单词进行排序,用于2分
j = 4;
while(j--)//各个方向旋转4次得到的字符串
{
flag = k = 0;
for(i = 0; i<cnt && c2 != 4; i++)
{
int x = num[i].x, y = num[i].y;
if(m1[x][y] != '.')
{
a1[k++] = m1[x][y];
flag = 1;
}
else if(flag)
{
a1[k++] = ' ';
flag = 0;
}
if(i == cnt-1)
{
rotate();
i = -1;
c2++;
}
}
k--;
while(a1[k] == ' ') k--;
a1[k+1] = '\0';
c2 = 0;
strcpy(m4[c1++], a1);
rotate();
}
qsort(m4, c1, sizeof(m4[0]), cmp);//求得第一个认识的就为答案,应为已按字典序排好
flag = 0;
for(i = 0; i<c1; i++)//判断4个每一种旋转得到的字符串是否认识
{
int len = strlen(m4[i]);
k = 0;
for(j = 0; j<len; j++)
{
if(m4[i][j] != ' ')
a1[k++] = m4[i][j];
if(m4[i][j] == ' ' || j == len-1)
{
a1[k] = '\0';
if(!binary(a1)) break;
k = 0;
}
if(j == len-1)//求得答案
{
flag = 1;
printf("Case #%d: ", c3++);
printf("%s\n", m4[i]);
i = c1;
}
}
}
if(!flag)
{
printf("Case #%d: ", c3++);
printf("FAIL TO DECRYPT\n");
}
}
return 0;
}