• UVA 10205 Stack 'em Up


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


  • 相关阅读:
    事件总线2
    微信小程序视频录制教程
    vue插件开发-toast
    云计算中的测试,可从哪些维度入手
    ES配置及FAQ
    Azkaban安装及问题
    python 反编译 compileall
    平凡利用redis进行数据读写的一种优化
    彻底弄懂Redis的内存淘汰策略
    c# 判断年龄精确到日
  • 原文地址:https://www.cnblogs.com/staginner/p/2293288.html
Copyright © 2020-2023  润新知