uva127 "Accordian" Patience

简介: uva127 "Accordian" Patience
#include <stdio.h>#include <stdlib.h>#define LOCAL#define ERROR 0#define OK 1typedefstructdata{
charrank;
charsuit;
structdata*next;
}Data;
typedefstructlnode{
intcount;
Data*top;
structlnode*next;
}LNode, *LinkList;
LinkListinitList();
intGetElem(LNode*h, inti, LNode**e);
LNode*GetPrecursor(LinkListh, LNode*e);
intmatch(Data*a, Data*b);
voidfreespace(LNode*h);
intmain()
{
intans[52];
inti;
intfirst;
charstr[3];
LinkListh=NULL;
intcount=0;
intstatus;
LNode*node , *e=NULL, *p=NULL, *pre=NULL;
Data*q=NULL;
intflag;
Data*datanode=NULL;
intpiles;
#ifdef LOCALfreopen("c://uva_in.txt", "r", stdin);
//freopen("c://uva_out.txt", "w", stdout);#endifwhile (1)
    {
scanf("%s", str);
if (str[0] =='#')
break;
if (count==0)
h=initList();
datanode= (Data*)malloc(sizeof(Data));
datanode->rank=str[0];
datanode->suit=str[1];
datanode->next=NULL;
node= (LNode*)malloc(sizeof(LNode));
node->top= (Data*)malloc(sizeof(Data));
node->top->next=datanode;
node->count=1;
node->next=h->next;
h->next=node;
p=h->next;
while (1)
        {
flag=1;
while (flag)
            {
flag=0;
status=GetElem(p, 3, &e);
if (status==ERROR|| (status==OK&&!match(p->top->next, e->top->next)))   
status=GetElem(p, 1, &e);
if (status==OK&&match(p->top->next, e->top->next))
                {
flag=1;
q=p->top->next;
p->top->next=q->next;
q->next=e->top->next;
e->top->next=q;
e->count++;
p->count--;
if (p->count==0)
                    {
pre=GetPrecursor(h, p);
pre->next=p->next;
free(p);
                    }
p=e;
                }
            }
pre=GetPrecursor(h, p);
if (pre!=h)
p=pre;
elsebreak;
        }
count++;
if (count==52)
        {
p=h->next;
i=0;
while (p)
            {
ans[i++] =p->count;
p=p->next;
            }
piles=i;
if (piles==1)
printf("%d pile remaining: ", piles);
elseprintf("%d piles remaining: ", piles);
for (i=piles-1, first=1; i>=0; i--)
            {
if (first)
first=0;
elseprintf(" ");
printf("%d", ans[i]);
            }
printf("/n");
freespace(h);
count=0;
        }
    }
return0;
}
LinkListinitList()
{
LNode*p= (LNode*)malloc(sizeof(LNode));
p->top=NULL;
p->next=NULL;
returnp;
}
intGetElem(LNode*h, inti, LNode**e)
{
LNode*p=h;
intj=0;
while (p&&j<i)
    {
p=p->next;
j++;
    }
if (!p)
returnERROR;
*e=p;
returnOK;
}
//获得该结点的前驱LNode*GetPrecursor(LNode*h, LNode*e)
{
LNode*p=h;
while (p->next!=e)
p=p->next;
returnp;
}
intmatch(Data*a, Data*b)
{
if (a->rank==b->rank||a->suit==b->suit)
return1;
elsereturn0;
}
voidfreespace(LNode*h)
{
LNode*p;
Data*q;
if (h->next)
    {
p=h->next;
while (p->top->next)
        {
q=p->top->next;
p->top->next=q->next;
free(q);
        }
free(p->top);
freespace(h->next);
    }
free(h);
}
目录
相关文章
uva 10340 all in all
输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串是。
42 0
uva10152 ShellSort
uva10152 ShellSort
62 0
UVa11776 - Oh Your Royal Greediness!
UVa11776 - Oh Your Royal Greediness!
55 0
UVa 10082 WERTYU
Problem Description A common typing error is to place the hands on the keyboard one row to the right of the correct position.
891 0
|
机器学习/深度学习 人工智能
uva 10870 Recurrences
点击打开uva 10870 思路:构造矩阵+矩阵快速幂 分析: 1 题目给定f(n)的表达式 f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n -3) + .
735 0
|
人工智能
uva 10189 Minesweeper
/* Minesweeper WA了n次才知道uva格式错了也返回wa没有pe啊尼玛 */ #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;string.h&gt; using namespace std; char a[105][105]; int main() { int i,j,n,m,
938 0
|
JavaScript 定位技术
uva 10047 - The Monocycle
点击打开链接uva 10047 思路:bfs 分析: 1 题目给定一个起始的状态然后要求是否可以到达目标状态 2 这些状态包括了位置,方向,底面颜色。
851 0
uva 11627 Slalom
点击打开链接uva 11627 思路:二分答案 分析: 1 给定S个滑雪板的速度,问是否可以找到一个滑板使得通过所有的门的时间最少,如果找不到输出IMPOSSIBLE 2 很明显的二分题目,我们知道了二分那应该怎么判断是否可以通过所有...
1067 0
uva10859Placing Lampposts
题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以他为一个端点的所有边,在灯的总数最小的前提下,被两盏灯同时照亮的边数应当尽量大。 分析:d(i,j)表示i的父节点放灯的状态为j(1表示放,0不放),以i为根的树的最小x值     x=Ma+c, a表...
791 0
下一篇
DataWorks