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

#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;
}

你可能感兴趣的:(UVA 127 (暑期-线性表-B-"Accordian" Patience))