HDOJ 4119 Isabella's Message

~~~題目鏈接~~~

題目大意:給出一個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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章