HDU 4431 Mahjong 2012天津A题 模拟题
思路:枚举每张牌,然后加入这张牌,看这牌是否能胡。
判胡:1.注意特判 7 对子,九一 这两个胡牌规则
2.(胡的牌里必须有一个对子)枚举这个对子,然后再进行处理就方便多了
注意:情况1特判和情况2的牌可能会重复,要去重。
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int vis[6][11], num[6][11]; char a[15][5]; struct node { int x, y; node(){} node(int xx, int yy): x(xx), y(yy) {}; friend bool operator ==(node a, node b) { return a.x == b.x && a.y == b.y; } }tmp, ans[1005]; int k; bool g[6]; int sum; bool flag; void init(int x, int y, int p, int q) { int i, j; for(i = 1; i <= 4; i++) for(j = 1; j <= 9; j++) { if(i == 4 && j > 7) continue; num[i][j] = vis[i][j]; } num[p][q] -= 2; flag = 1; } bool cmp(node a, node b) { return a.x < b.x || a.x == b.x && a.y < b.y; } bool solve() { int i, j, x, y, p, q; for(i = 1; i <= 4; i++) //枚举加入的牌 for(j = 1; j <= 9; j++) { if( i == 4 && j > 7 || vis[i][j] >= 4) continue; vis[i][j]++; for(p = 1; p <= 4; p++) //枚举胡牌中必要的一对对子 for(q = 1; q <= 9; q++) { if(vis[p][q] < 2 || (p == 4 && q > 7) ) continue; init(i, j, p, q); for(x = 1; x <= 3; x++) // 对全部num[][]进行扫描处理 for(y = 1; y <= 9; y++) { if(num[x][y] == 1) { if(y <= 7 && num[x][y+1] >= 1 && num[x][y+2] >= 1) { num[x][y+1]--; num[x][y+2]--; num[x][y]--; } else goto loop; // goto表示该情况下无法胡牌 } if(num[x][y] == 2) { if(y <= 7 && num[x][y+1] >= 2 && num[x][y+2] >= 2) { num[x][y+1] -= 2; num[x][y+2] -= 2; num[x][y] -= 2; } else goto loop; } if(num[x][y] == 3) num[x][y] = 0; if(num[x][y] == 4) { if(y <= 7 && num[x][y+1] >= 1 && num[x][y+2] >= 1) { num[x][y+1]--; num[x][y+2]--; num[x][y]--; num[x][y] = 0; } else goto loop; } } for(x = 1; x <= 7; x++) { if(num[4][x] == 3 || num[4][x] == 0) num[4][x] = 0; else goto loop; } if(flag) ans[k++] = node(i, j); loop: flag = 0; } vis[i][j]--; } return k > 0; } char buf[66] = {"-mspc"}; int main() { int i, j, cas; int x, y; scanf("%d", &cas); while(cas--) { k = 0; memset(vis, 0, sizeof(vis)); for(i = 1; i <= 13; i++) { scanf("%s", a[i]); y = a[i][0] - '0'; char ccc = a[i][1]; if(ccc == 'm') x = 1; if(ccc == 's') x = 2; if(ccc == 'p') x = 3; if(ccc == 'c') x = 4; vis[x][y]++; } //1.七对子 int cnt = 0; for(i = 1; i <= 4; i++) for(j = 1; j <= 9; j++) { if(i == 4 && j > 7) continue; if(vis[i][j] == 2) cnt++; if(vis[i][j] == 1) tmp.x = i, tmp.y = j; } if(cnt == 6) ans[k++] = tmp; //2.九一 sum = 0; int pp = 0, qq = 0; for(i = 1; i <= 3; i++) { if(vis[i][1] == 1) sum++; if(vis[i][9] == 1) sum++; if(vis[i][1] == 2) pp++; if(vis[i][9] == 2) pp++; if(vis[i][1] == 0) qq++, tmp = node(i, 1); if(vis[i][9] == 0) qq++, tmp = node(i, 9); } for(i = 1; i <= 7; i++) { if(vis[4][i] == 1) sum++; if(vis[4][i] == 2) pp++; if(vis[4][i] == 0) qq++, tmp = node(4, i); } if(sum == 13) { for(i = 1; i <= 3; i++) ans[k++] = node(i, 1), ans[k++] = node(i, 9); for(i = 1; i <= 7; i++) ans[k++] = node(4, i); } else if(sum == 11 && pp == qq && qq == 1) ans[k++] = tmp; memset(g, 0 , sizeof(g)); // others if(!solve()) printf("Nooten\n"); else { sort(ans, ans+k, cmp); k = unique(ans, ans+k) - ans; //去重 printf("%d", k); for(i = 0; i < k; i++) { printf(" %d", ans[i].y); printf("%c", buf[ans[i].x]); } puts(""); } } return 0; } /* 111 1s 1s 2s 2s 4s 4s 5s 5s 6s 6s 7s 7s 8s 1s 9s 1m 9m 1p 9p 1c 2c 3c 4c 5c 6c 7c 1s 9s 1m 9m 1p 9p 1c 2c 3c 4c 5c 6c 1m 2s 3s 4s 5s 6s 7s 7s 1c 1c 1c 2c 2c 2c 2s 3s 4s 5s 6s 7s 7s 7s 1c 1c 2c 2c 2c 1s 1s 2s 2s 3s 4s 4s 5s 5s 6s 6s 1c 1c 1s 1s 1s 2s 3s 4s 5s 6s 7s 8s 9s 9s 9s 1s 1s 1s 1s 2s 3s 9s 9s 9s 2s 3s c1 c1 1s 1s 1s 1s 2s 2s 2s 3s 3s 3s 4s 4s 4s */


浙公网安备 33010602011771号