#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<stack>
#define db(a) cout << #a << " = " << a << endl;
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl;
using namespace std;
int total = 0;
struct carta {
char *kind;
carta(char *kind) : kind(kind) {}
};
void move(vector< stack<carta> >& cartas,const int& target,const int& source) {
cartas[target].push(cartas[source].top());
cartas[source].pop();
if(cartas[source].empty()) total--, cartas.erase(cartas.begin() + source);
}
bool can(vector< stack<carta> >& cartas,const int& target,const int& source) {
return cartas[target].top().kind[0] == cartas[source].top().kind[0] ||
cartas[target].top().kind[1] == cartas[source].top().kind[1];
}
void jugar(vector< stack<carta> >& cartas) {
int i = 0;
again:
for (; i < total; i++) {
if (i >= 3 && can(cartas, i - 3, i)) {
move(cartas, i - 3, i);
i = i - 3;
goto again;
}
else if( i >= 1 && can(cartas, i - 1, i)) {
move(cartas, i - 1, i);
i = i - 1;
goto again;
}
}
}
int main() {
char line[200], line2[200];
bool fin = false;
while(1) {
total = 52;
vector< stack<carta> > cartas(52);
gets(line);
if(line[0] == '#') break;
char *st, sep[] = " ";
st = strtok(line, sep);
int i = 0;
while (st) {
carta card(st);
cartas[i++].push(card);
st = strtok(0, sep);
}
gets(line2);
st = strtok(line2, sep);
while (st) {
carta card(st);
cartas[i++].push(card);
st = strtok(0, sep);
}
jugar(cartas);
printf("%d pile%s remaining:", total, (total > 1) ? "s" : "");
for (int i = 0; i < total; i++) {
if(!cartas[i].empty()) printf(" %d", cartas[i].size());
}
printf("\n");
}
return 0;
}
viernes, 21 de octubre de 2011
127 - Accordian Patience - UVA
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario