zoukankan      html  css  js  c++  java
  • UVA127 模拟牌堆AC 120ms

    //用了三小时AC的还是很激动的!!

    #include <cstdio>
    #include <cstring>
    #include <stack>
    using namespace std;
    stack <int> piles[55];
    int order[55];
    int cnt;
    void Init()
    {
     cnt = 52;
     for (int i = 0;i < 52;i++)
     {
      while (!piles[i].empty())
       piles[i].pop();
      order[i] = i;
     }
    }
    bool match(int a, int b)
    {
     return (a % 14 == b % 14) || (a / 14 == b / 14);
    }
    int search(int src)
    {
     int dst = src;
     while (1)
     {
      if (dst - 3 >= 0 && match(piles[order[dst - 3]].top(), piles[order[src]].top()))
      {
       dst = dst - 3;continue;
      }
      if (dst - 1 >= 0 && match(piles[order[dst - 1]].top(), piles[order[src]].top()))
      {
       dst = dst - 1;continue;
      }
      return dst;
     }
    }
    char s[100], s1[100];
    bool read()
    {
     fgets(s, 95, stdin);
     if (s[0] == '#')return false;
     fgets(s1, 95, stdin);
     return true;
    }
    void trans(char *s, int piles_start)
    {
     int len = strlen(s);
     for (int i = 0;i<len;i += 3)//每行最后一张牌+2后直接跳过了换行符
     {
      int t = 0;
      switch (s[i])
      {
      case 'A':t += 1;break;
      case 'T':t += 10;break;
      case 'J':t += 11;break;
      case 'Q':t += 12;break;
      case 'K':t += 13;break;
      default:t += s[i] - '0';break;
      }
      switch (s[i + 1])
      {
      case 'D':t += 14 * 1;break;
      case 'H':t += 14 * 2;break;
      case 'S':t += 14 * 3;break;
      default:break;//'C'
      }
      piles[i / 3 + piles_start].push(t);//i步长为2--
     }
    }
    void transfer()
    {
     trans(s, 0);
     trans(s1, 26);
    }
    void output()
    {
     printf("%d %s remaining:", cnt, cnt == 1 ? "pile" : "piles");
     for (int i = 0;i < cnt;i++)
      printf(" %d", piles[order[i]].size());
     printf("
    ");
    }
    void solve(int src,int dst)//src,dst为order下标
    {
     int s = order[src], d = order[dst];
     if (!piles[s].empty())
     {
      int t = piles[s].top();piles[s].pop();
      piles[d].push(t);
     }
     if (piles[s].empty())
     {
      cnt--;
      for (int j = src;j < cnt;j++)
       order[j] = order[j + 1];
     }
    }
    void Solve()
    {
     for (int i = 1;i < cnt;i++)
     {
      int ret = search(i);
      if (ret != i)
      {
       solve(i, ret);
       
       i = ret;
      }
     }
    }
    int main(void)
    {
     while (read())
     {
      Init();
      transfer();
      Solve();
      output();
     }
     return 0;
    }
  • 相关阅读:
    简易的sniffer程序
    ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题
    5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
    Java设计模式-单例模式
    WordPress的用户系统总结
    STM8S EEPROM 操作
    简化ui文件转换写法
    大型网站架构之应用服务器集群化
    大型网站架构之分布式缓存
    大型网站架构之JAVA中间件
  • 原文地址:https://www.cnblogs.com/schsb/p/7903605.html
Copyright © 2011-2022 走看看