您的位置:首页 > 其它

UVa 127 线性表模拟题

2014-10-26 23:20 225 查看
感觉这是一道很恶心的模拟题,英语太渣,看得很勉强就上网搜了一下知道题目的大意:<p>有52张扑克牌(大小王去掉了),每张牌用两个字符表示:例如 8H 第一个字符代表大小,第二个代表花色,现在开始发牌,如果发到的这张牌前面第3堆(或者第1堆)最上面有这种花色或者这个大小的牌 ,就把这张牌放到那堆上面,然后再向前面看可不可以再将这张牌放到更前面,知道不能放位置,如果前面的第1堆和第3堆都能放,优先放到第三堆上面,放完以后看看这张牌后面的牌能不能进行相同的操作,直到所有的牌都不能进行操作为止,再放下一张牌,最后问你,52张牌都放完并且操作完共剩了多少堆,并且输出堆数和相应堆数的牌数。</p><p>这道题还有一个坑,就是最后输出的时候1 堆要用pile,被这个错误坑了2次,唉。。。

下面是AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <stack>
#include <algorithm>
#include <queue>

using namespace std;
struct Stack
{
int cnt;
char s[52][3];
};
char s[53][3];
int len;
int mark;
Stack q[52];

bool match(char *s1,char *s2)
{
if(s1[0]==s2[0] || s1[1]==s2[1])
return true;
return false;
}
void add(char *s,Stack *p)
{
strcpy((*p).s[(*p).cnt++],s);
}
void cpy(Stack *p1,Stack *p2)
{
(*p1).cnt=(*p2).cnt;
for(int i=0;i<(*p1).cnt;i++)
{
strcpy((*p1).s[i],(*p2).s[i]);
}
}
void sort(Stack *p,int m)
{
len--;
for(int i=m;i<=len;i++)
{
cpy(&p[i],&p[i+1]);
}
}

void opert(Stack *p,int m)
{
if(m==0)
{
mark=0;
return;
}
else
if(m>=3 && match(p[m].s[p[m].cnt-1],p[m-3].s[p[m-3].cnt-1]))
{
add(p[m].s[p[m].cnt-1],&p[m-3]);
p[m].cnt--;
if(p[m].cnt==0)
sort(p,m);
opert(p,m-3);
}
else
if(match(p[m].s[p[m].cnt-1],p[m-1].s[p[m-1].cnt-1]))
{
add(p[m].s[p[m].cnt-1],&p[m-1]);
p[m].cnt--;
if(p[m].cnt==0)
sort(p,m);
opert(p,m-1);
}
else
{
mark=m;
return;
}
}
void digui(Stack *p)
{
if(mark==len)
{
return;
}
while(mark!=len)
{
mark++;
opert(p,mark);
}
}
int main()
{
//freopen("test.in","r",stdin);
while(scanf("%s",s[0])!=EOF && s[0][0]!='#')
{
for(int i=0;i<52;i++)
q[i].cnt=0;
len=0;
q[len].cnt++;
strcpy(q[len].s[0],s[0]);
for(int i=1;i<52;i++)
{
scanf("%s",s[i]);
if(i==25)
getchar();
if(len>=2 && match(q[len-2].s[q[len-2].cnt-1],s[i]))
{
add(s[i],&q[len-2]);
mark=len-2;
opert(q,len-2);
digui(q);
}
else
if(match(q[len].s[q[len].cnt-1],s[i]))
{
add(s[i],&q[len]);
mark=len;
opert(q,mark);
digui(q);
}
else
{
q[++len].cnt=1;
strcpy(q[len].s[0],s[i]);
}
}
if(len==0)
printf("%d pile remaining:",len+1);
else
{
printf("%d piles remaining:",len+1);
}
for(int i=0;i<=len;i++)
{
printf(" %d",q[i].cnt);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: