您的位置:首页 > 其它

UVA127 "Accordian" Patience 【模拟】

2017-04-16 17:32 405 查看
题目链接:https://vjudge.net/problem/UVA-127

题意:

见紫书P179 习题6-9的题目描述。

题解:

模拟题,按照题目叙述移动直到某一次没法移动为止。

P.S:注意细节,有个 n = 52 我放在了循环外面调了一下午= =b

代码:

// by DenyTianly
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int inf = 1 << 26;

struct pok {
char s[105];
pok() {}
pok(char *q) {
strcpy(s, q);
}
};

int n;
const int size = 1005;
vector<pok> pile[size];

bool iCompare(pok a, pok b) {
if(a.s[0] == b.s[
bbc3
0] || a.s[1] == b.s[1]) return true;
return false;
}

void move(int x) {
for ( int i = x; i < n; i ++ ) {
pile[i].clear();
for ( int j = 0; j < pile[i+1].size(); j ++ ) {
pile[i].push_back( pok(pile[i+1][j].s) );
}
}
}

int main(){
//  freopen("UVA127.in", "r", stdin);
char str[105];

while( scanf("%s", str), str[0] != '#' ) {
n = 52;
pile[0].push_back( pok(str) );
for ( int i = 1; i < n; i ++ ) {
scanf("%s", str);
pile[i].push_back(pok(str));
}

bool fg = true;
while( fg ) {

fg = false;
for ( int i = 1; i < n; i ++ ) {
int y = i-3;
int cur = pile[i].size()-1;
int cury = pile[y].size()-1;

if(y >= 0 && iCompare(pile[i][cur].s, pile[y][cury].s)) {
pile[y].push_back(pok(pile[i][cur].s));
pile[i].pop_back();

if(pile[i].size() == 0) {
-- n;
move(i);
}

fg = true;
break;
}

int x = i-1;
int curx = pile[x].size()-1;

if(x >= 0 && iCompare(pile[i][cur].s, pile[x][curx].s)) {
pile[x].push_back(pok(pile[i][cur].s));
pile[i].pop_back();

if(pile[i].size() == 0) {
-- n;
move(i);
}

fg = true;
break;
}
}
}
printf("%d pile%sremaining:", n, n==1?" ":"s ");
for ( int i = 0; i < n; i ++ ) printf(" %d", pile[i].size());
puts("");

for ( int i = 0; i < 52; i ++ ) pile[i].clear();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: