我正在制定一个可以解决问题的计划。卡片和检查是否有一对存在或同花顺。我很好奇是否有更有效的方法来检查任何两个元素是否匹配,而不是下面的代码。谢谢!
//checks if any card has value the same
if (temp2 == (temp4 || temp6 || temp8 || temp10) || temp4 == (temp6 || temp8 || temp10) || temp6 == (temp8 || temp10) || temp8 == temp10){
++pairCount;
}
//checks if card has all the same suit
if (temp1 == temp3 == temp5 == temp7 == temp9){
++flushCount;
}
答案 0 :(得分:0)
如果您按照值对手进行排序,则可以仅针对相邻的卡进行检查。假设有类似的东西:
struct card
{
int value;
int suit;
};
struct card hand[5];
你可以这样做:
if (hand[0].value == hand[1].value ||
hand[1].value == hand[2].value ||
hand[2].value == hand[3].value ||
hand[3].value == hand[4].value)
您当前的支票无论如何都不起作用 - temp2 == (temp4 || temp6 || temp8 || temp10)
可能无法完成您的想法。你需要这样的东西:
if ((temp2 == temp4) || (temp2 == temp6) || (temp2 == temp8) || (temp2 == temp10))
将temp2
与其他每个变量进行比较。
答案 1 :(得分:0)
指针可以是卡号哈希映射的向量,即
vector<unsigned int> cardCounts;
cards.resize(13,0);
vector<Card> cards{getCards()};
for (const Card& c : cards) {
++cardCount[c.getNo()];
switch(cardCount[c.getNo()]) {
case 2:
//deal with pair
break;
case 3:
//deal with triple
break;
case 4:
//deal with quad
break;
}
}
你只需要小心,因为这段代码将执行dealWithPair(),然后执行dealWithTriple(),然后依赖于相同数量的卡的数量,依次执行dealWithQuads()。只要确保他们不会发生冲突
答案 2 :(得分:0)
将所有元素放在容器中:
std::vector<Card> cards = /* ... */ ;
按顺序放置元素。
sort(begin(cards), end(cards));
看看是否有重复的卡片:
auto it = adjacent_find(begin(cards), end(cards));
if (it != end(cards))
{
std::cout << "Card " << *it << " is repeated.\n";
}
else
{
std::cout << "No pairs\n";
}
您至少需要<algorithm>
和<iterator>
以及其他一些标题。
答案 3 :(得分:0)
我使用这种方法来简化检查配对(不是很干净,因为复杂度为O(n²)!)
bool check_pair(int *array){ //if you choose to pass -hand- as array of 5 integers
for(int i=0;i<5;i++){ // 5: I suppose its a poker game
for(int j=i+1;j<4;j++){
if(array[i]==array[j]){
return true;
}
}
}
return false;
}
答案 4 :(得分:-1)
如何将每张卡片写入地图,其中键是面部,值是它出现的次数?
具有值&#39; 2&#39;的地图元素的数量那就是你的对数,你可以免费得到你的三种和四种。
请注意,对于一张五张牌的牌,我不知道计算上每张牌与其他牌相比更有效率。