【イザベラメッセージ] [SPOJ - ISABシミュレーション] [] []回転行列

考え

トピックリンク
のタイトルの意味:タイトル文字はマスクを与えた後、オーダーNの行列の外観を与え、その後、あなたが知っておくべきいくつかの単語を与え、最終的には最小の文究極の辞書順で出力ができましょう。
アイデア:シミュレーションが可能主題によります。ここについて学ぶために、にstringstreamを使用されます。しかし、個人的に私は、コードのこの部分の下に取り付けた回転行列のより重要な部分、であると感じています。

void zhuan()
{
    char temp[maxn][maxn];
    memset(temp, 0, sizeof(temp));      //临时数组
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            temp[i][j] = mask[N-j-1][i];            //这一块当成结论记住吧
        }
    }
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            mask[i][j] = temp[i][j];
}

ACコード

#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<sstream>
using namespace std;
int T, N, M;
const int maxn = 50 + 10;
char s[maxn][maxn], mask[maxn][maxn];
string words[maxn*2];
map<string, int> word;
vector<string> standard;
void zhuan()
{
    char temp[maxn][maxn];
    memset(temp, 0, sizeof(temp));
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            temp[i][j] = mask[N-j-1][i];
        }
    }
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            mask[i][j] = temp[i][j];
}
int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    cin >> T;
    for(int t = 1; t <= T; t++)
    {
        memset(s, 0, sizeof(s));
        memset(mask, 0, sizeof(mask));
        cin >> N;
        for(int i = 0; i < N; i++)
            scanf("%s", s[i]);
        for(int i = 0; i < N; i++)
            scanf("%s", mask[i]);
        cin >> M;
        word.clear();
        for(int i = 0; i < M; i++)
        {
            cin >> words[i];
            word[words[i]] = 1;
        }
        standard.clear();

        string tmmp[4];
        for(int ans = 0; ans < 4; ans++)
        {
            tmmp[ans] = "";
            for(int i = 0; i < N; i++)
            {
                for(int j = 0; j < N; j++)
                {
                    if(mask[i][j] == '*')
                    {
                        if(s[i][j] != '.')
                            tmmp[ans] += s[i][j];
                        else
                            tmmp[ans] += " ";
                    }
                }
            }
            zhuan();
        }
        string tmp[4];
        tmp[0] = tmmp[0] + tmmp[1] + tmmp[2] + tmmp[3];
        tmp[1] = tmmp[1] + tmmp[2] + tmmp[3] + tmmp[0];
        tmp[2] = tmmp[2] + tmmp[3] + tmmp[0] + tmmp[1];
        tmp[3] = tmmp[3] + tmmp[0] + tmmp[1] + tmmp[2];
        for(int ans = 0; ans < 4; ans++)
        {
            int _front = 0, _back = tmp[ans].size();
            for(int i = 0; i < tmp[ans].size(); i++)
            {
                if(tmp[ans][i] == ' ')
                    _front++;
                else
                    break;
            }
            for(int j = tmp[ans].size() - 1; j >= 0; j--)
            {
                if(tmp[ans][j] == ' ')
                    --_back;
                else
                    break;
            }
            string temp = "";
            for(int i = _front; i < _back; i++)
                temp += tmp[ans][i];
            //cout << "temp =" << temp << "\\" << endl;
            string table[maxn*2];
            stringstream ss(temp);
            int cnt = 0;
            while(ss >> table[cnt])
            {
                cnt++;
            }
            int flag = 0;
            for(int i = 0; i < cnt; i++)
            {
                if(word[table[i]])
                    continue;
                else
                {
                    flag = 1;
                    break;
                }
            }
            if(!flag)
                standard.push_back(temp);
        }
        if(!standard.empty())
        {
            sort(standard.begin(), standard.end());
            cout << "Case #" << t << ": " << standard[0] << endl;
        }
        else
            cout << "Case #" << t << ": " << "FAIL TO DECRYPT" << endl;
    }
}

おすすめ

転載: www.cnblogs.com/KeepZ/p/11372084.html