G - Shuffle'mアップPOJ - 3087

ポーカーテーブルでのポーカープレーヤーのための共通の娯楽は、チップのスタックをシャッフルすることです。チップをシャッフルするポーカーチップの2つのスタックを用いて開始することによって実行される  S 1  と  S 2、含む各スタック  Cの  チップ。各スタックは、いくつかの異なる色のチップが含まれていてもよいです。

実際のシャッフル処理は、以下からチップをインタリーブすることによって実行される  S 1  からチップと  S 2  について以下に示すように  C  = 5:

単一結果スタック、  S 12は、2つの*含まれている  Cの  チップを。最下部チップ  S 12  から最下部チップである  S 2そのチップの上から一番下のチップである  S 1インターリーブプロセスは、2服用継続番目  の底部からチップを  S 2  上に配置すること  S 12、2に続く番目  の底部からチップ  S 1  などから最上位までチップ上の  S 1  の上に配置され、  S 12

シャッフル動作の後、  S 12が  最下位とることによって2つの新しいスタックに分割される  のC  からチップ  S 12を  新規形成する  S 1  及び最上位  のC  からチップ  S 12を  新規形成する  S 2シャッフル操作は、新しい形成するために繰り返されてもよい  S 12を

特定の結果のスタックがあれば、この問題について、あなたは決定するためにプログラムを記述します  S 12は、  2つのスタック何回かをシャッフルすることにより形成することができます。

入力

入力の最初の行は、単一の整数含ま  N、(1≤  N  データセットその次の数である≤1000)。

各データセットは、入力の4行から成ります。データセットの最初の行は、整数を指定  C、(1≤  C  それぞれ初期スタック(内のチップの数である≤100)S 1  および  S 2)。各データセットの2行目は、それぞれの色を指定する  Cの  スタックにチップを  S 1一番下のチップから始まります。各データセットの3行目は、それぞれの色を指定する  Cの  スタックにチップを  S 2  一番下のチップから始まります。色は、単一の大文字(として表されているA  を介して  H)。チップの色との間には空白またはセパレータはありません。各データセットの4行目は2 *含ま  Cが  文字(大文字A  を介し  Hのシャッフリングの所望の結果の色を表す)、  S 1  及び  S 2  0回以上。一番下のチップの色が最初に指定されています。

出力

各データセットの出力は、ディスプレイセット数(1かかわらず、単一の行から成る  N)、スペース、およびシャッフル操作の最小数は、所望の結果として生じるスタックを取得するために必要な整数値。所望の結果は、データセットの入力を使用して到達できない場合、値の負の1を表示する(-1)シャッフル動作の数を。

サンプル入力

2 
4 
AHAH 
HAHA 
HHAAAAHH 
3 
EBR 
EBR 
EEDDCC

サンプル出力

2. 1 
2 -1 

直接シミュレーション:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
#include <queue>
#include <map>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <numeric>
#include <cmath>
#include <iomanip>
//#include <unordered_set>
//#include <unordered_map>
//#include <xfunctional>
#define ll  long long
#define PII  pair<int, int>
using namespace std;
int dir[5][2] = { {0,1} ,{0,-1}, {1,0}, {-1,0} ,{0,0} };
const long long INF = 0x7f7f7f7f7f7f7f7f;
const int inf = 0x3f3f3f3f;
const double pi = 3.14159265358979;
const int mod = 1e9 + 7;
const int maxn = 1e5;
//if(x<0 || x>=r || y<0 || y>=c)
struct node
{
    int cnt;
    string s;
};
int res,n;    
string s1, s2,ss;
set<string> visited;
int main()
{
    int t1;
    cin >> t1;
    for (int q = 1; q <= t1; q++)
    {
        cin >> n;
        cin >> s1 >> s2>>ss;
        node t1;
        t1.cnt = 1;
        t1.s = "";
        for (int i = 0; i < n; i++)
        {
            t1.s.push_back(s2[i]);
            t1.s.push_back(s1[i]);
        }
        while(1)
        {
            if (t1.s == ss)
            {
                res = t1.cnt;
                break;
            }
            if (visited.find(t1.s) != visited.end())
            {
                res = -1;
                break;
            }
            visited.insert(t1.s);
            string st1, st2;
            st1 = t1.s.substr(0, n);
            st2 = t1.s.substr(n, n);
            t1.s = "";
            for (int i = 0; i < n; i++)
            {
                t1.s.push_back(st2[i]);
                t1.s.push_back(st1[i]);
            }
            t1.cnt++;
        }
        cout << q << " " << res << endl;
    }
    return 0;
}

 

おすすめ

転載: www.cnblogs.com/dealer/p/12563254.html