题意:把一堆扑克牌,按照规则:如果左边1张或3张和它具有同花色或等级,把这张牌移到上面去,每次移动后,在从头开始移动,知道都移动完,输出剩余几堆与每堆牌数,如果1张牌有2个可以移动的地方,优先移动到左3位置。
思路:用结构体存每一张牌,用栈来储存牌堆,每次判断能不能移动牌,每次移动后进行一次变换
<span style="font-size:18px;">#include <stdio.h> #include <string.h> struct pai { char value; char suit; } pai[52]; int num_dui; int stack[52][52];//这是存每个堆上的牌顺序 int num[52];//存每个堆的牌的数量 int judge; void traa(int n) { for (int i = n; i < num_dui - 1; i ++) { for(int j = 0; j < 52; j ++) { stack[i][j] = stack[i + 1][j]; } num[i] = num[i + 1]; } num_dui--; } void tra(int a, int b) { stack[b][num[b]] = stack[a][num[a] - 1]; stack[a][num[a] - 1] = -1; num[a] --; num[b] ++; if (num[a] == 0) { traa(a); } } int find() { for (int i = 1; i < num_dui; i ++) { if (i >= 3 && (pai[stack[i - 3][num[i - 3] - 1]].suit == pai[stack[i][num[i] - 1]].suit || pai[stack[i - 3][num[i - 3] - 1]].value == pai[stack[i][num[i] - 1]].value)) { judge = 1; tra(i , i - 3); break; } if(pai[stack[i - 1][num[i - 1] - 1]].suit == pai[stack[i][num[i] - 1]].suit || pai[stack[i - 1][num[i - 1] - 1]].value == pai[stack[i][num[i] - 1]].value) { judge = 1; tra(i, i - 1); break; } } return judge; } int main() { while (scanf("%c%c%*c", &pai[0].value, &pai[0].suit) != EOF && pai[0].value != '#') { memset(num, 0 ,sizeof(num)); for (int i = 0; i < 52; i ++) for (int j = 0; j < 52; j ++) stack[i][j] = -1; stack[0][0] = 0; num_dui = 52; num[0] = 1; judge = 1; for (int i = 1 ; i < 52; i ++) { scanf("%c%c%*c", &pai[i].value, &pai[i].suit); stack[i][0] = i; num[i] = 1; } while (judge) { judge = 0; find(); } if (num_dui != 1) { printf("%d piles remaining:", num_dui); for (int i = 0; i < num_dui; i ++) printf(" %d", num[i]); printf("\n"); } else { printf("%d pile remaining:", num_dui); for (int i = 0; i < num_dui; i ++) printf(" %d", num[i]); printf("\n"); } } return 0; }</span>