UVA 10205 Stack 'em Up

7121 ワード

UVA_10205
この問題は模擬問題のような感じがしますが、データを読むときは卵が痛いだけです.
私たちは常に各位置がそのカードであることを記録することができますが、このようにすると、移動するたびに一時的な配列を借りなければなりません.移動中に前回の各位置のカードの状況を知る必要があるからです.
そこで、各カードがどの位置にあるかを考えて記録したほうがいいです.そうすれば、移動するたびに、各カードの位置がどこに変わったかを知る必要があります.
最後に各カードの位置を各位置にどのカードがあるかに復元すればよい.
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 110
char b[500];
int g[MAXN][60], p[60], ans[60];
char value[][10] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
char suit[][10] = {"Clubs", "Diamonds", "Hearts", "Spades"};
void init()
{
int i, j, k, ok = 0, n, num, t;
gets(b);
sscanf(b, "%d", &n);
num = 1, k = 0;
for(i = 1; i <= 52; i ++)
p[i] = i;
while(gets(b) != NULL)
{
if(b[0] == '\0')
break;
for(i = 0; b[i];)
{
if(!isdigit(b[i]))
{
i ++;
continue;
}
sscanf(&b[i], "%d", &t);
while(isdigit(b[i]))
i ++;
if(!ok)
{
k ++;
g[num][t] = k;
if(k == 52)
{
k = 0;
num ++;
if(num > n)
ok = 1;
}
}
else
{
for(j = 1; j <= 52; j ++)
p[j] = g[t][p[j]];
}
}
}
}
void printresult()
{
int i, v, s;
for(i = 1; i <= 52; i ++)
ans[p[i]] = i;
for(i = 1; i <= 52; i ++)
{
v = (ans[i] - 1) % 13;
s = (ans[i] - 1) / 13;
printf("%s of %s
", value[v], suit[s]);
}
}
int main()
{
int t;
gets(b);
sscanf(b, "%d", &t);
gets(b);
while(t --)
{
init();
printresult();
if(t)
printf("
");
}
return 0;
}