习题6-9 纸牌游戏("Accordian"Patience, UVa 127)
程序员文章站
2024-03-19 15:28:40
...
原题链接:https://vjudge.net/problem/UVA-127
分类:链表
备注:vector模拟链表
这题有点水,放到这章估计本该直接用链表的,但是我不太熟还是用vector代替了。
代码如下:
#include<string>
#include<iostream>
#include<vector>
using namespace std;
vector<string>pile[52];
bool match(int x, int y) {
if (pile[x][pile[x].size() - 1][0] == pile[y][pile[y].size() - 1][0])return true;
if (pile[x][pile[x].size() - 1][1] == pile[y][pile[y].size() - 1][1])return true;
return false;
}
void push(int x, int y) {
pile[x].push_back(pile[y][pile[y].size() - 1]);
pile[y].pop_back();
}
int main(void) {
string s;
while (cin >> s && s != "#") {
for (int i = 0; i < 52; i++)pile[i].clear();
pile[0].push_back(s);//s[0]是点数,s[1]是花色
for (int i = 1; i < 52; i++) {
cin >> s; pile[i].push_back(s);
}
for (int i = 1; i < 52; i++) {
if (pile[i].empty())continue;
int flag = 0;
int k = i;
while (k > 0) {
int pos1 = k, cnt = 0;
while (cnt < 1) {
pos1--;
if (pos1 < 0)break;
if (!pile[pos1].empty())cnt++;
}
int pos3 = pos1;
while (cnt < 3) {
pos3--;
if (pos3 < 0)break;
if (!pile[pos3].empty())cnt++;
}
if (cnt == 3) {
if (match(pos3, k)) {
push(pos3, k); k = pos3; flag = 1;
}
else if (match(pos1, k)) {
push(pos1, k); k = pos1; flag = 1;
}
else break;
}
else if (cnt > 0) {
if (match(pos1, k)) {
push(pos1, k); k = pos1; flag = 1;
}
else break;
}
else break;
}
if (flag)i = 0;
}
vector<int>ans;
for (int i = 0; i < 52; i++)
if (!pile[i].empty())
ans.push_back(pile[i].size());
if (ans.size() == 1)printf("1 pile remaining: 52\n");
else {
printf("%d piles remaining: ", ans.size());
for (int i = 0; i < ans.size(); i++)
printf("%d%c", ans[i], i == ans.size() - 1 ? '\n' : ' ');
}
}
return 0;
}