simulation。給52張撲克牌,向左一張或左三張合併同數字或同花色,輸出合併完成後剩下的堆數和每一堆的張數。每合併一次,要檢查是否可以繼續再向左合併。
CODE
#include <iostream> using namespace std; #define MAX 52 int main(){ int i, j, k, moveto; char pile[MAX][MAX+MAX], remain[MAX]; int len[MAX]; while( (cin >> pile[0]) && (pile[0][0] != '#') ){ len[0] = 2; for(i=1; i<MAX; i++){ cin >> pile[i]; len[i] = 2; }//i: read in all cards i=1; while( i < MAX ){ moveto = i; for(j=i-1; j>=0 && len[j]==0; --j);//1 left if( (j >= 0) && (pile[j][ len[j]-2 ] == pile[i][ len[i]-2 ] || pile[j][ len[j]-1 ] == pile[i][ len[i]-1 ]) ) moveto = j; for(--j; j>=0 && len[j]==0; --j);//2 left for(--j; j>=0 && len[j]==0; --j);//3 left if( (j >= 0) && (pile[j][ len[j]-2 ] == pile[i][ len[i]-2 ] || pile[j][ len[j]-1 ] == pile[i][ len[i]-1 ]) ) moveto = j; if( i != moveto ){ len[i] -= 2; pile[moveto][ len[moveto]++ ] = pile[i][ len[i] ]; pile[moveto][ len[moveto]++ ] = pile[i][ len[i]+1 ]; i = moveto; } else for(++i; i<MAX && len[i]==0; ++i); } k = 0; for(i=0; i<MAX; i++) if( len[i] > 0 ) remain[k++] = i; cout << k << ( k == 1 ? " pile" : " piles" ) << " remaining:"; for(i=0; i<k; i++) cout << ' ' << (len[ remain[i] ] / 2); cout << endl; }//while return 0; }
No comments:
Post a Comment