题目来源: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 ***

暴力搜索即可。

 //////////////////////////////////////////////////////////////////////////
// POJ1053 Set Me
// Memory: 228K Time: 0MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <iostream> using namespace std; char cards[][]; //检查第p位是否符合条件
bool check_bit(int i, int j, int k, int p) {
if (cards[i][p] == cards[j][p] && cards[j][p] == cards[k][p]) {
return true;
}
if (cards[i][p] != cards[j][p] && cards[j][p] != cards[k][p]
&& cards[i][p] != cards[k][p]) {
return true;
}
return false;
} //检查第i、j、k张牌的组合能否构成set
bool check(int i, int j, int k) {
if (check_bit(i, j, k, ) && check_bit(i, j, k, )
&& check_bit(i, j, k, ) && check_bit(i, j, k, )) {
return true;
}
return false;
} int main(void) {
while (cin >> cards[]) {
for (int i = ; i < ; ++i) {
cin >> cards[i];
}
cout << "CARDS: " << cards[];
for (int i = ; i < ; ++i) {
cout << " " << cards[i];
}
cout << endl;
cout << "SETS: ";
int set_id = ;
for (int i = ; i < ; ++i) {
for (int j = i + ; j < ; ++j) {
for (int k = j + ; k < ; ++k) {
if (check(i, j, k)) {
if (set_id >= ) {
cout << " ";
}
cout << ++set_id << ". " << cards[i] << " "
<< cards[j] << " " << cards[k] << endl;
}
}
}
}
if (set_id == ) {
cout << "*** None Found ***" << endl;
}
cout << endl;
}
return ;
}

POJ1053 Set Me的更多相关文章

随机推荐

  1. 对数组名取地址 a[ ],&a

    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的 ...

  2. hadoop再次集群搭建(4)-Cloudera Manager Installation

       决定选择 Cloudera Manager 进行安装,阅读官方文档,掌握大概脉络.         Cloudera Manager在集群已经实现ssh免秘钥登录,能够访问网络资源和本地资源的情 ...

  3. Markdown简要规则

    We believe that writing is about content, about what you want to say – not about fancy formatting. 我 ...

  4. [cerc2017J]Justified Jungle

    题目大意:删去k条边,树变为相等个点的连通分量,求所有正整数k. 解题关键:树dp,不必求因子. #include<bits/stdc++.h> using namespace std; ...

  5. Codeforces 1142B Lynyrd Skynyrd

    ---恢复内容开始--- 题意:给你一个排列p和数组a,有t组询问,每次询问一个区间的子序列中是否有p的一个循环排列. 思路:以p = [3, 1, 2]举例, 我们扫描数组b,假设当前数字是1,那么 ...

  6. 吐槽下linq to sql的分页功能

    在调试程序的时候发现一个非常奇怪的问题: 用使用linq分页,分页到第二页的时候,第二页里面有第一页里出现的数据,开始还以为是. linq语句写的有问题,调试半天,无解.后来发现是因为没有排序的缘故. ...

  7. git 删除本地分支和远程分支

    (1)使用命令git branch -a 查看所有分支 其中,remote/origin/master表示的是远程分支 (2)删除远程分支 使用命令 git push origin --delete ...

  8. iOS 打包生成ipa文件(使用终端命令打包)

    1. 打开终端 2.在终端输入cd +空格 把工程文件直接拖到终端,然后回车 3. 在终端输入xcodebuild,回车 然后你可以发现工程文件里多了一个build文件夹 在build文件夹中,有一个 ...

  9. 面试题:struts 值栈 有用

    一. 核心部分 1. [核心试题]完成当天课堂练习 2. [多选题] 阅读如下代码中,下列哪种方式可以在页面正确迭代获取集合中的数据 (ABC) public String add(){ ValueS ...

  10. Overloaded的方法是否可以改变返回值的类型

    摘要: 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同) Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载 ...