uva的感觉好卡。。去看看poj发现有一样的题目,就在poj上测了,还有错误反馈QAQ不过感觉也是挺卡的,还是zoj流畅。
此题目- -纯练习链表。。。
好吧,,,在poj运行16ms。。为什么在uva就是超了3s- -。。。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct lnode
{
stack<string> poke;
lnode* fron;
lnode* next;
};
bool test(string a,string b)
{
if(a[0] == b[0] || a[1] == b[1])
return true;
else return false;
}
bool Find_left3(lnode* top,string po,int m)
{
lnode* go = top;
for(int m = 0;m < 2;m++)
{
if(go->fron != NULL)
go = go->fron;
else break;
if(m == 1 && test(go->poke.top(),po))
{
go->poke.push(po);
return true;
}
}
return false;
}
bool Find_left3_1(lnode* a,int& num,lnode* &top,int m)
{
lnode* go = a;
lnode* left = a;
for(;m < 3;m++)
{
if(left->fron != NULL)
left = left->fron;
else break;
if(m == 2 && test(go->poke.top(),left->poke.top()))
{
left->poke.push(go->poke.top());
go->poke.pop();
if(go->poke.empty())
{
if(top == go)
top = top->fron;
go->fron->next = go->next;
if(go->next != NULL)
go->next->fron = go->fron;
go->fron = go->next = NULL;
num--;
}
return true;
}
}
return false;
}
int main()
{
string po;
while(cin >> po && po != "#")
{
lnode pokes[52];
lnode* top = &pokes[0];
int num = 1;
pokes[0].poke.push(po);
pokes[0].next = &pokes[1];
pokes[0].fron = NULL;
for(int m = 1;m<52;m++)
{
cin >> po;
if(Find_left3(top,po,0));
else if(Find_left3(top,po,1));
else
{
num++;
pokes[m].poke.push(po);
top->next = &pokes[m];
pokes[m].fron = top;
pokes[m].next = NULL;
top = &pokes[m];
}
lnode* go = &pokes[0];
while(go != NULL)
{
if(Find_left3_1(go,num,top,0)) {go = &pokes[0];continue;}
else if(Find_left3_1(go,num,top,2)) {go = &pokes[0];continue;}
else
go = go->next;
}
}
lnode* go = &pokes[0];
cout << num << " piles remaining:";
while(go != NULL)
{
cout << ' ' << go->poke.size();
go = go->next;
}
cout << endl;
}
return 0;
}