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;
}
原文地址:https://www.cnblogs.com/schsb/p/7903605.html