G - Shuffle'm Hasta POJ - 3087

Un pasatiempo común para los jugadores de póquer en una mesa de póquer es para mezclar pilas de fichas. Fichas arrastrando los pies se realiza comenzando con dos pilas de fichas de póquer,  S 1  y  S 2 , cada pila que contiene  C  fichas. Cada pila puede contener fichas de varios colores diferentes.

El funcionamiento real aleatorio se realiza intercalando un chip de  S 1  con un chip de  S 2  como se muestra abajo para  C  = 5:

La pila resultante sola,  S 12 , contiene de 2 *  C  fichas. El chip más inferior de  S 12  es el chip más inferior de  S 2 . En la parte superior de ese chip, es el chip más inferior de  S 1 . El proceso de entrelazado sigue teniendo la 2 nd  de chip desde el fondo de  S 2  y colocando que en  S 12 , seguido por el 2 nd  de chip desde el fondo de  S 1  y así sucesivamente hasta el chip más alta de  S 1  se coloca en la parte superior de  S 12 .

Después de la operación shuffle,  S 12  se divide en 2 nuevas pilas tomando las más inferiores  C  virutas de  S 12  para formar un nuevo  S 1  y las más altas  C  virutas de  S 12  para formar un nuevo  S 2 . La operación aleatoria puede entonces ser repetido para formar un nuevo  S 12 .

Para este problema, que va a escribir un programa para determinar si una pila resultante en particular  S 12  puede estar formado por revolver dos pilas cierto número de veces.

Entrada

La primera línea de entrada contiene un solo número entero  N , (1 ≤  N  ≤ 1000) que es el número de conjuntos de datos que siguen.

Cada conjunto de datos consiste en cuatro líneas de entrada. La primera línea de un conjunto de datos especifica un número entero  C , (1 ≤  C  ≤ 100) que es el número de chips en cada pila inicial ( S 1  y  S 2 ). La segunda línea de cada conjunto de datos especifica los colores de cada uno de los  C  chips en pila  S 1 , comenzando con el chip más inferior. La tercera línea de cada conjunto de datos especifica los colores de cada uno de los  C  fichas en pila  S 2  comenzando con el chip más inferior. Los colores se expresan como una sola letra mayúscula ( A  a través de  H). No hay espacios en blanco o separadores entre los colores de chips. La cuarta línea de cada conjunto de datos contiene 2 *  C  mayúscula letras ( A  a través de  H ), que representan los colores del resultado deseado de la combinación aleatoria de  S 1  y  S 2  cero o más veces. El color del chip más inferior se especifica primero.

Salida

De salida para cada conjunto de datos consiste en una sola línea que muestra el número conjunto de datos (1 aunque  N ), un espacio, y un valor entero que es el número mínimo de operaciones de reproducción aleatoria necesarios para obtener la pila resultante deseado. Si el resultado deseado no puede ser alcanzado usando la entrada para el conjunto de datos, visualizar el valor negativo 1 ( -1 ) para el número de operaciones de reproducción aleatoria.

Sample Input

2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC

Sample Output

1 2
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;
}

 

Supongo que te gusta

Origin www.cnblogs.com/dealer/p/12563254.html
Recomendado
Clasificación