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\n", value[v], suit[s]);
}
}
int main()
{
int t;
gets(b);
sscanf(b, "%d", &t);
gets(b);
while(t --)
{
init();
printresult();
if(t)
printf("\n");
}
return 0;
}