题目大意:神牛讲的很清楚~http://blog.csdn.net/camelwombat/article/details/5949508 感觉还是首先要读懂题目意思,这个也是有难度的
题目思路:
用数组模拟链表,考的是代码能力,关键是逻辑关系搞清楚,然后再敲,再就是细节问题,代码有一点小错就需要调很久。
参考这位神牛的思路写的……http://blog.csdn.net/goomaple/article/details/7802686
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cctype> 6 #include <stack> 7 #include <queue> 8 #include <deque> 9 #include <map> 10 #include <set> 11 #include <vector> 12 #include <cmath> 13 #include <algorithm> 14 #define lson l, m, rt<<1 15 #define rson m+1, r, rt<<1|1 16 using namespace std; 17 typedef long long int LL; 18 const int MAXN = 0x7fffffff; 19 const int MINN = -0x7fffffff; 20 const double eps = 1e-9; 21 const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1}, 22 {1,1},{1,-1},{-1,-1}}; 23 typedef struct node{ 24 int len; char rank[54], suit[54]; 25 }node; 26 node card[54]; 27 void eachmove(int pos, int step) { 28 int Len = card[pos-step].len, len = card[pos].len; 29 card[pos-step].suit[Len] = card[pos].suit[len-1]; 30 card[pos-step].rank[Len] = card[pos].rank[len-1]; 31 card[pos-step].len++; card[pos].len--; 32 } 33 void moveremain(int pos) { 34 int i, j; 35 for (i = pos; card[i+1].len!=0; ++i) { 36 for (j = 0; j < card[i+1].len; ++j) { 37 card[i].suit[j] = card[i+1].suit[j]; 38 card[i].rank[j] = card[i+1].rank[j]; 39 } 40 card[i].len = card[i+1].len; 41 } 42 } 43 int solve() { 44 int i, cnt =52, len, Len; 45 char suit, rank; 46 bool mrk, flag; 47 while (1) { 48 flag = false; 49 for (i= 1; i < cnt;++i) { 50 len = card[i].len; 51 suit = card[i].suit[len-1]; 52 rank = card[i].rank[len-1]; 53 mrk = false; 54 if (i >= 3) { 55 Len = card[i-3].len; 56 if (suit == card[i-3].suit[Len-1] || rank== \ 57 card[i-3].rank[Len-1]) { 58 eachmove(i, 3); 59 if (card[i].len==0) { 60 moveremain(i); 61 cnt--; card[cnt].len = 0; 62 } 63 mrk = flag = true; 64 } 65 } 66 if (!mrk && i >= 1) { 67 Len = card[i-1].len; 68 if (suit == card[i-1].suit[Len-1] || rank== \ 69 card[i-1].rank[Len-1]) { 70 eachmove(i, 1); 71 if (card[i].len==0) { 72 moveremain(i); 73 cnt--; card[cnt].len = 0; 74 } 75 flag = true; 76 } 77 } 78 if (flag) break; 79 } 80 if (!flag) break; 81 } 82 return cnt; 83 } 84 int main(void){ 85 #ifndef ONLINE_JUDGE 86 freopen("uva127.in", "r", stdin); 87 #endif 88 int i, j; 89 while (1) { 90 scanf("%c", &card[0].rank[0]); 91 if (card[0].rank[0] == '#') break; 92 scanf("%c", &card[0].suit[0]); 93 card[0].len = 1; 94 for (i = 1; i < 52; ++i) { 95 getchar(); 96 scanf("%c%c", &card[i].rank[0], &card[i].suit[0]); 97 card[i].len = 1; 98 } 99 card[52].len = 0; 100 int cnt = solve(); 101 if (cnt > 1) printf("%d piles remaining:", cnt); 102 else printf("%d pile remaining:", cnt); 103 for (j = 0; j < cnt; ++j) printf(" %d", card[j].len); 104 printf("\n"); 105 getchar(); 106 } 107 108 return 0; 109 }
这种题目,非常锻炼代码的准确度什么的……