Старый 12.12.2007, 21:34   #17 (permalink)
Geplew
Энтузиаст
 
Аватар для Geplew
 
Регистрация: 29.11.2007
Адрес: Воронеж
Сообщений: 360
Отправить сообщение для Geplew с помощью ICQ
Мой код, если кому интересно. На кривость не ругацца!

Код:
bool TestStraight(int a, int b, int c)
{
#define min(z, x)  (((z) < (x)) ? (z) : (x))
#define max(z, x)  (((z) > (x)) ? (z) : (x))

	int minV, maxV;

	minV = min(min(a, b), c);
	maxV = max(max(a, b), c);

	if(maxV - minV < 5) return true;

	if(a == 1) a = 14;
	if(b == 1) b = 14;
	if(c == 1) c = 14;

	minV = min(min(a, b), c);
	maxV = max(max(a, b), c);

	if(maxV - minV < 5) return true;

	return false;
}
//—————————————————————————————————————-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int i, j, k, n;
	int board[5];
	int value[5];
	int suit[5];
	int noDraws;

	randomize();
	noDraws = 0;

	for(i = 0; i < Edit1->Text.ToInt(); i++)
	{
		// Генерация борда
		board[0] = board[1] = board[2] = board[3] = board[4] = -1;
		for(j = 0; j < 5; j++)
		{
			do {
				n = random(52);
				if(n == board[0] || n == board[1] || n == board[2] || n == board[3] || n == board[4])
				{ continue; }
				else
				{ board[j] = n; break; }
			} while(true);
		}

		// Проверка на флеш-дро
		for(j = 0; j < 5; j++)
			suit[j] = board[j] / 13;
		n = 0;
		for(j = 0; j < 5; j++)
			if(suit[j] == 0) n++;
		if(n >= 3) continue;
		n = 0;
		for(j = 0; j < 5; j++)
			if(suit[j] == 1) n++;
		if(n >= 3) continue;
		n = 0;
		for(j = 0; j < 5; j++)
			if(suit[j] == 2) n++;
		if(n >= 3) continue;
		n = 0;
		for(j = 0; j < 5; j++)
			if(suit[j] == 3) n++;
		if(n >= 3) continue;

		// Проверка на пары
		for(j = 0; j < 5; j++)
			value[j] = board[j] % 13 + 1;
		n = 0;
		for(j = 0; j < 4; j++)
			for(k = j + 1; k < 5; k++)
				if(value[j] == value[k]) n++;
		if(n) continue;

		// Проверка на стрит-дро
		// 11100
		if(TestStraight(value[0], value[1], value[2])) continue;
		// 11010
		if(TestStraight(value[0], value[1], value[3])) continue;
		// 11001
		if(TestStraight(value[0], value[1], value[4])) continue;
		// 10110
		if(TestStraight(value[0], value[2], value[3])) continue;
		// 10101
		if(TestStraight(value[0], value[2], value[4])) continue;
		// 10011
		if(TestStraight(value[0], value[3], value[4])) continue;
		// 01110
		if(TestStraight(value[1], value[2], value[3])) continue;
		// 01101
		if(TestStraight(value[1], value[2], value[4])) continue;
		// 01011
		if(TestStraight(value[1], value[3], value[4])) continue;
		// 00111
		if(TestStraight(value[2], value[3], value[4])) continue;


		// Дров нет!
		noDraws++;
	}

	Label4->Caption = i;
	Label5->Caption = noDraws;
	Label6->Caption = 100 * float(noDraws) / float(i);
}
Geplew вне форума