题目来源:http://poj.org/problem?id=1053
题目大意:
有一种牌,共有81张。每张牌有四个属性,每种属性有三种可能取值:形状(D,O,S),数字(1,2,3),颜色(R,G,P),纹理(O,F,S)。如果三张牌的的任意一种属性都满足:三张牌的该属性值均相同或各不相同,则成这三张牌可以构成一个set。给出12张牌的所有属性值,求该组牌中是所有set。
输入:由若干组数据组成。每组十二行,每行表示一张牌的属性值。不同组数据之间用空格隔开。
输出:先输出所有的牌,然后依次输出找到的set,若找不到则输出“*** None Found ***”。不同样例之间用空格隔开。具体格式见sample。
Sample Input
S1PS D3PO S2GF O2GS O2GF O3PO S2RF S3GS D2GS O1GS O1GF S2PS O2GF O1PF D2PO D3RO S2PO O1GF O1GS D2GO S3PF S2GF D2GS S1RS
Sample Output
CARDS: S1PS D3PO S2GF O2GS O2GF O3PO S2RF S3GS D2GS O1GS O1GF S2PS SETS: 1. D3PO S2RF O1GS 2. S3GS D2GS O1GS CARDS: O2GF O1PF D2PO D3RO S2PO O1GF O1GS D2GO S3PF S2GF D2GS S1RS SETS: *** None Found ***
暴力搜索即可。
1 ////////////////////////////////////////////////////////////////////////// 2 // POJ1053 Set Me 3 // Memory: 228K Time: 0MS 4 // Language: C++ Result: Accepted 5 ////////////////////////////////////////////////////////////////////////// 6 7 #include <iostream> 8 9 using namespace std; 10 11 char cards[12][5]; 12 13 //检查第p位是否符合条件 14 bool check_bit(int i, int j, int k, int p) { 15 if (cards[i][p] == cards[j][p] && cards[j][p] == cards[k][p]) { 16 return true; 17 } 18 if (cards[i][p] != cards[j][p] && cards[j][p] != cards[k][p] 19 && cards[i][p] != cards[k][p]) { 20 return true; 21 } 22 return false; 23 } 24 25 //检查第i、j、k张牌的组合能否构成set 26 bool check(int i, int j, int k) { 27 if (check_bit(i, j, k, 0) && check_bit(i, j, k, 1) 28 && check_bit(i, j, k, 2) && check_bit(i, j, k, 3)) { 29 return true; 30 } 31 return false; 32 } 33 34 int main(void) { 35 while (cin >> cards[0]) { 36 for (int i = 1; i < 12; ++i) { 37 cin >> cards[i]; 38 } 39 cout << "CARDS: " << cards[0]; 40 for (int i = 1; i < 12; ++i) { 41 cout << " " << cards[i]; 42 } 43 cout << endl; 44 cout << "SETS: "; 45 int set_id = 0; 46 for (int i = 0; i < 12; ++i) { 47 for (int j = i + 1; j < 12; ++j) { 48 for (int k = j + 1; k < 12; ++k) { 49 if (check(i, j, k)) { 50 if (set_id >= 1) { 51 cout << " "; 52 } 53 cout << ++set_id << ". " << cards[i] << " " 54 << cards[j] << " " << cards[k] << endl; 55 } 56 } 57 } 58 } 59 if (set_id == 0) { 60 cout << "*** None Found ***" << endl; 61 } 62 cout << endl; 63 } 64 return 0; 65 }