第6週の期間限定シミュレーションで、ドンドンIIの魔法をマスター

タイトル:

東洞にはA×Bのトランプがあります。各トランプには、サイズ(整数、a、範囲0〜A-1)とスーツ(整数、b)、範囲0〜B-1があります。

トランプは異なり、ユニークです。つまり、同じサイズで同じ2枚のカードはありません。

「1枚のカード」とは、5枚のカードが手札にあることを意味します。これらの5枚のカードは、表と裏の順番ではなく、カードタイプを形成できます。9種類のカードを定義しました。以下は、9種類のカードのルールです。カードを一致させるには、「小さい番号を最初に」を使用します。 「カード番号」(1から9までの整数):

1.ストレートフラッシュ:ルール5とルール4が同時に満たされます
。2.爆弾:4枚のカードの
うち5枚のサイズが同じです。カードのサイズも同じ
4.フラッシュ:同じスーツの
カード5枚5.ストレート:x、x + 1、x + 2、x + 3、x + 4のサイズのカード5枚。
6. 3枚のカード:5枚のカード(3枚は同じサイズ)
7. 2つのペア:5枚のカード(2枚は同じサイズ)、他の3枚のカードは2枚が同じサイズです
。 :5枚のカードのうち2枚は同じサイズです
9.余裕がない:この手は上記のカードタイプのいずれも満たしていません。

今、ドンドンはA×Bのトランプから2枚のカードを取ります!(a1、b1)と(a2、b2)です(aはサイズ、bはスーツです)。

次に、残りのカードから3枚のカードをランダムに取り出す必要があります。手を作ろう!

実際、コードをプレイすることに加えて、ドンドンは余暇にはまだ魔術師であり、今、彼は自分の将来の可能性、つまり彼が得る「最初の手」の可能性を予測したいと考えています。 、1から9まで)「このハンドのハンドタイプを示すために、彼には将来9通りの可能性がありますが、可能な各スキームの数は異なります。

これで、ドンドンのアゴモの目はなくなりました。アゴモが9種類それぞれのオプションの数を数えるのを手伝う必要があります。

入力フォーマット

1行目には整数AとB(5≤A≤25、1≤B≤4)
が含まれています。2行目には整数a1、b1、a2、b2(0≤a1、a2≤A-1、0≤b1が含まれています、b2≤B-1、(a1、b1)≠(a2、b2))。

出力フォーマット

1行を出力します。この行には9つの整数があり、各整数は9つのカードタイプの数を表します(カード番号の小さい順から大きい順)。

サンプル

サンプル入力1

5 2
1 0 3 1
1

出力例1

0 0 0 0 8 0 12 36 0

サンプル入力2

25 4
0 0 24 3
1

出力例2

0 2 18 0 0 644 1656 36432 113344

アイデア

タイトルに従い、入手した2枚のカードと条件を満たす残りのカードを組み合わせて5枚のカードを作成し、カードタイプ番号を特定して、可能なカードタイプの数を記録する必要があります。ここでの方法は、すでに手元にある2枚のカードに加えて、適格なカードを配列に入れてから、配列に対してdfsを実行して、すべてのカードの組み合わせをトラバースします。2を選択したときに、選択したカードが5枚の場合、カードの種類を判定し、対応するカードの種類のレコード数を+1して、最終的にレコード配列を出力します。

反射:

この質問の要点は、すべてのカードをトラバースすることです、私はクラスの間にdfsを考慮しませんでした(私はよく理解していないため)私は常にbfsを使用しようとしました。クラスの後の交換の後、dfsが選ばれました。

コード:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct poker
{
	int val, col;
};
int a, b, f1, v1, f2, v2, flag;
int sum[9];
poker note[105];
vector<poker> arr;

bool cmp10(poker a,poker b)
{
	return a.val < b.val;
}

void judge()
{
	vector<poker> tp = arr;
	sort(tp.begin(), tp.end(), cmp10);
	bool th = false, sz = false;
	int yz = 0, hs = 0;
	for (int i = 0; i < 4; i++)
	{
		if (tp[i].col == tp[i + 1].col)
			hs++;
		if (tp[i].val + 1 == tp[i + 1].val)
			yz++;
	}
	if (yz == 4)
		sz = true;
	if (hs == 4)
		th = true;
	if (sz == true && th == true)
	{
		sum[0]++;
		return;
	}
	if (tp[0].val==tp[3].val||tp[1].val==tp[4].val)
	{
		sum[1]++;
		return;
	}
	if ((tp[0].val==tp[2].val&&tp[3].val==tp[4].val)
		||(tp[0].val==tp[1].val&&tp[2].val==tp[4].val))
	{
		sum[2]++;
		return;
	}
	if (th == true)
	{
		sum[3]++;
		return;
	}
	if (sz == true)
	{
		sum[4]++;
		return;
	}
	if (tp[0].val == tp[2].val || tp[1].val == tp[3].val || tp[2].val == tp[4].val)
	{
		sum[5]++;
		return;
	}
	if ((tp[0].val == tp[1].val && (tp[2].val == tp[3].val || tp[3].val == tp[4].val))
		|| (tp[1].val == tp[2].val&&tp[3].val == tp[4].val))
	{
		sum[6]++; 
		return;
	}
	if (tp[0].val == tp[1].val || tp[1].val == tp[2].val
		|| tp[2].val == tp[3].val || tp[3].val == tp[4].val)
	{
		sum[7]++;
		return;
	}
	sum[8]++;
	return;
}

void dfs(int i)
{
	if (arr.size() == 5)
	{
		judge();
		return;
	}
	if (i < flag)
	{
		dfs(i + 1);
		arr.push_back(note[i]);
		dfs(i + 1);
		arr.pop_back();
	}
}

int main()
{
	scanf_s("%d%d%d%d%d%d", &a, &b, &v1, &f1,&v2,&f2);
	for (int i = 0; i < 9; i++)
		sum[i] = 0;
	arr.push_back({ v1,f1 });
	arr.push_back({ v2,f2 });
	flag = 0;
	for (int i = 0; i < a; i++)
	{
		for (int j = 0; j < b; j++)
		{
			if ((i != v1 || j != f1) && (i != v2 || j != f2))
			{
				note[flag] = { i,j };
				flag++;
			}
		}
	}
	dfs(0);
	for (int i = 0; i < 8; i++)
		cout << sum[i] << ' ';
	cout << sum[8] << endl;
    return 0; 
}
元の記事を32件公開しました 賞賛されました0 訪問数677

おすすめ

転載: blog.csdn.net/qq_43814559/article/details/105254665