您的位置:首页 > 其它

uva 127 - "Accordian" Patience题解

2014-03-23 10:20 381 查看
此题的意思网上有很多的翻译,就不说了。一开始花费好多时间去理解题意,还是英语太差了。看过网上很多解法有用二维数组的,但是那样每移动一次就要把后面的全部前移一位,这个时间复杂度o(n)其实是没有必要的,用链表就可以解决,每一个元素是一个栈,参考大牛的思想用数组去模拟链表发觉写的更加清楚一点。以后就用博客把每一个我觉得挺好的题目贴上来吧,当作一个保存的地方

//栈与链表的问题
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;

struct card
{
char face[3];//最后一个‘/0’
};

struct Node
{
stack<card>pile;
} node[60];

int next[60],prev[60];

void move(int pos, int n)
{
if(n == 3)
{
int prev3 = prev[prev[prev[pos]]];
node[prev3].pile.push(node[pos].pile.top());
node[pos].pile.pop();
}
else if(n == 1)
{
int prev1 = prev[pos];
node[prev1].pile.push(node[pos].pile.top());
node[pos].pile.pop();
}
if(!node[pos].pile.empty())//为了填补空位
return;
prev[next[pos]] = prev[pos];
next[prev[pos]] = next[pos];
}
int main()
{
int i;
card temp;
while(1)
{
int ncount = 0;
bool flag = true;
for(i = 0; i < 52; i++)
{
scanf("%s",temp.face);
if(temp.face[0] == '#')
return 0;
while(!node[i].pile.empty())
node[i].pile.pop();
node[i].pile.push(temp);
next[i] = i+1;
prev[i] = i-1;
}
//        move(5,3);
//        printf("%s\n%d\n",node[2].pile.top().face,node[2].pile.size());
//        cout<<next[4];
//        int prev3 = prev[prev[prev[5]]];
//        printf("%s\n",node[prev3].pile.top());
while(flag)
{
int w = 1;
for(i = next[0]; i != 52; i = next[i],w++)
{
int prev1 = prev[i];
int prev3 = prev[prev[prev[i]]];
if(w >= 3)
{
if((node[prev3].pile.top().face[0] == node[i].pile.top().face[0])
|| (node[prev3].pile.top().face[1] == node[i].pile.top().face[1]))
{
move(i,3);
flag = false;
break;
}
}
if((node[prev1].pile.top().face[0] == node[i].pile.top().face[0])
|| (node[prev1].pile.top().face[1] == node[i].pile.top().face[1]))
{
move(i,1);
flag = false;
break;
}
}
if(!flag)//如果没有移动就该停止了;
flag = true;
else
flag = false;
}
for(i = 0; i != 52; i = next[i])
ncount++;
if(ncount == 1)
printf("%d pile remaining: %d\n",ncount,node[0].pile.size());
else
{
printf("%d piles remaining:",ncount);
for(int i = 0; i != 52; i = next[i])
printf (" %d",node[i].pile.size());
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: