您的位置:首页 > 其它

UVA 127 (暑期-线性表-B-"Accordian" Patience)

2014-07-21 09:24 399 查看
#include <cstdio>
#include <cstring>

int main() {
//card[55][55][2] :  最多有可能有 52 叠牌, 每叠牌最多有 52 张牌, 每张牌有数字和花色
//每一叠牌, card[i][ card[i][54][0]-1 ][0] card[i][ card[i][54][0]-1 ][1] 存这叠牌的最上面那张牌的数字和花色
//card[i][54][0]存张数, card[i][0][0], card[i][0][1] 存折叠牌最下面那张牌的数字和花色
char card[55][55][2];
char str[100];
while (gets(str) && str[0] != '#') {
for (int i = 0; i < 26; i++) {
card[i][0][0] = str[i * 3];
card[i][0][1] = str[i * 3 + 1];
card[i][54][0] = 1;
}
gets(str);
for (int i = 26; i < 52; i++) {
card[i][0][0] = str[(i - 26) * 3];
card[i][0][1] = str[(i - 26) * 3 + 1];
card[i][54][0] = 1;
}

int i = 0;
while (i < 52) {
if (i == 0) {
i++;
while (card[i][54][0] == 0) {
i++;
}
}
int j = i-1;
int count_1 = 0, count_2 = 0, kong_1, kong_2, kong_3 = 0, kong_4 = 0;
//找到左边第三张牌的位置 和左边第一张牌的位置
while (count_1 < 3) {
if (card[j][54][0] != 0) {
count_1++, count_2 = 1;
if (count_1 == 1)
kong_2 = j;//记录左边第一张牌的位置
}
if (count_1 == 3)
kong_1 = j; //记录左边第三张牌的位置
if (j > 0)
j--;
else
break;
}
if (count_1 == 3) {
//是否匹配
if (card[i][ card[i][54][0]-1 ][0] == card[kong_1][ card[kong_1][54][0]-1 ][0] || card[i][ card[i][54][0]-1 ][1] == card[kong_1][ card[kong_1][54][0]-1 ][1]) {
card[kong_1][54][0]++;		 //张数加一
card[kong_1][ card[kong_1][54][0]-1 ][0] = card[i][ card[i][54][0]-1 ][0];  //把牌叠好后,最上面的那张数字
card[kong_1][ card[kong_1][54][0]-1 ][1] = card[i][ card[i][54][0]-1 ][1];  //把牌叠好后,最上面的那花色
card[i][54][0]--;   //去掉这张牌
i = kong_1;
kong_3 = 1;
}
}
if (count_2 == 1  && !kong_3) {
if (card[i][ card[i][54][0]-1 ][0] == card[kong_2][ card[kong_2][54][0]-1 ][0] || card[i][ card[i][54][0]-1 ][1] == card[kong_2][ card[kong_2][54][0]-1 ][1]) {
card[kong_2][54][0]++;		 //张数加一
card[kong_2][ card[kong_2][54][0]-1 ][0] = card[i][ card[i][54][0]-1 ][0];  //把牌叠好后,最上面的那张数字
card[kong_2][ card[kong_2][54][0]-1 ][1] = card[i][ card[i][54][0]-1 ][1];  //把牌叠好后,最上面的那花色
card[i][54][0]--;   //去掉这张牌
i = kong_2;
kong_4 = 1;
}
}
if(!kong_3 && !kong_4) {
i++;
while (card[i][54][0] == 0) {  //找到右边第一张牌的位置
i++;
}
}
}
int num = 0;
for (int r = 0; r < 52; r++) {
if (card[r][54][0] != 0)
num++;
}
if (num == 1)
printf("%d pile remaining:", num);
else
printf("%d piles remaining:", num);

for (int r = 0; r < 52; r++) {
if (card[r][54][0] != 0)
printf(" %d", card[r][54][0]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: