[ create a new paste ] login | about

Link: http://codepad.org/XrqVqoQJ    [ raw code | output | fork ]

C, pasted on Apr 25:
#include <stdio.h>

static int Counts[14], SumOfCounts;	/* 既知のカードの数 */
static int Opened[14];			/* 場に存在する既知のカードの数 */
static int Cards[52], NumberOfCards;	/* 場に存在する既知のカード */
static int LastCard;			/* 最後に開いたカード */

/* カードを表す文字 */
static char* Characters[14] = {
	"_", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };

/* 開く */
static int OpenCard(int number)
{
	LastCard = number;
	++Counts[number];
	++SumOfCounts;
	++Opened[number];
	Cards[NumberOfCards++] = number;
	printf ("%sが出た\n", Characters[number]);
	return number;
}

/* 最悪のカードを出す(その1) */
static int NewCard1(void)
{
	int i;
	for (i = 1; i <= 13; ++i) {
		if (Opened[i] == 0 && Counts[i] != 4) {
			return OpenCard(i);
		}
	}
	for (i = 1; i <= 13; ++i) {
		if (Counts[i] != 4) {
			return OpenCard(i);
		}
	}
	LastCard = 0;
	return 0;
}

/* 最悪のカードを出す(その2) */
static int NewCard2(void)
{
	int i;
	for (i = 1; i <= 13; ++i) {
		if (i != LastCard && 1 <= Opened[i] && Counts[i] != 4) {
			return OpenCard(i);
		}
	}
	for (i = 1; i <= 13; ++i) {
		if (i != LastCard && Counts[i] != 4) {
			return OpenCard(i);
		}
	}
	if (Counts[LastCard] != 4) {
		return OpenCard(LastCard);
	}
	LastCard = 0;
	return 0;
}

/* 指定されたカードが取れるなら取る */
int CaptureCards(int number)
{
	int i, j, k;
	if (Opened[number] < 2) {
		return 0;
	}
	Opened[number] -= 2;
	for (i = 0; i < 2; ++i) {
		for (j = NumberOfCards - 1; j >= 0; --j) {
			if (Cards[j] == number) {
				Cards[j] = 0;
				for (k = j; k + 1 < NumberOfCards; ++k) {
					Cards[k] = Cards[k + 1];
				}
				break;
			}
		}
		--NumberOfCards;
	}
	printf("%sを取った\n", Characters[number]);
	return 1;
}

/* カードを表示する */
void Display(void)
{
	int i = 0;
	for (i = 0; i < NumberOfCards; ++i) {
		printf("%s ", Characters[Cards[i]]);
	}
	for (i = NumberOfCards; i < 52 - (SumOfCounts - NumberOfCards); ++i) {
		printf("* ");
	}
	printf("\n");
}

/* シミュレーション */
int main(int argc, char* argv[])
{
	int i, j, n;
	for (i = 0; i < 52 && !(NumberOfCards == 0 && SumOfCounts == 52); ++i) {
		printf("<%d手目>\n", i + 1);
		Display();
		if (NewCard1()) {
			if (!CaptureCards(LastCard)) {
				n = LastCard;
				if(NewCard2()) {
					if (n == LastCard) {
						CaptureCards(LastCard);
					}
				}
			}
		} else {
			for (j = 1; j <= 13; ++j) {
				if (CaptureCards(j)) {
					break;
				}
			}
		}
		printf("\n");
	}
	getchar();
	return 0;
}


Output:
<1手目>
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
Aが出た
2が出た

<2手目>
A 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
3が出た
Aが出た

<3手目>
A 2 3 A * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
4が出た
Aが出た

<4手目>
A 2 3 A 4 A * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
5が出た
Aが出た

<5手目>
A 2 3 A 4 A 5 A * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
6が出た
2が出た

<6手目>
A 2 3 A 4 A 5 A 6 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
7が出た
2が出た

<7手目>
A 2 3 A 4 A 5 A 6 2 7 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
8が出た
2が出た

<8手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
9が出た
3が出た

<9手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
10が出た
3が出た

<10手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 10 3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
Jが出た
3が出た

<11手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 10 3 J 3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
Qが出た
4が出た

<12手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
Kが出た
4が出た

<13手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K 4 * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
4が出た
4を取った

<14手目>
A 2 3 A 4 A 5 A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * * * * * * * * * * * * 
5が出た
5を取った

<15手目>
A 2 3 A 4 A A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * * * * * * * * * * * 
5が出た
6が出た

<16手目>
A 2 3 A 4 A A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K 5 6 * * * * * * * * * * * * * * * * * * * * * * * * 
5が出た
5を取った

<17手目>
A 2 3 A 4 A A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K 6 * * * * * * * * * * * * * * * * * * * * * * * 
6が出た
6を取った

<18手目>
A 2 3 A 4 A A 6 2 7 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * * * * * * * 
6が出た
6を取った

<19手目>
A 2 3 A 4 A A 2 7 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * * * * * * 
7が出た
7を取った

<20手目>
A 2 3 A 4 A A 2 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * * * * * 
7が出た
8が出た

<21手目>
A 2 3 A 4 A A 2 2 8 2 9 3 10 3 J 3 Q 4 K 7 8 * * * * * * * * * * * * * * * * * * 
7が出た
7を取った

<22手目>
A 2 3 A 4 A A 2 2 8 2 9 3 10 3 J 3 Q 4 K 8 * * * * * * * * * * * * * * * * * 
8が出た
8を取った

<23手目>
A 2 3 A 4 A A 2 2 8 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * * 
8が出た
8を取った

<24手目>
A 2 3 A 4 A A 2 2 2 9 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * * 
9が出た
9を取った

<25手目>
A 2 3 A 4 A A 2 2 2 3 10 3 J 3 Q 4 K * * * * * * * * * * * * * * 
9が出た
10が出た

<26手目>
A 2 3 A 4 A A 2 2 2 3 10 3 J 3 Q 4 K 9 10 * * * * * * * * * * * * 
9が出た
9を取った

<27手目>
A 2 3 A 4 A A 2 2 2 3 10 3 J 3 Q 4 K 10 * * * * * * * * * * * 
10が出た
10を取った

<28手目>
A 2 3 A 4 A A 2 2 2 3 10 3 J 3 Q 4 K * * * * * * * * * * 
10が出た
10を取った

<29手目>
A 2 3 A 4 A A 2 2 2 3 3 J 3 Q 4 K * * * * * * * * * 
Jが出た
Jを取った

<30手目>
A 2 3 A 4 A A 2 2 2 3 3 3 Q 4 K * * * * * * * * 
Jが出た
Qが出た

<31手目>
A 2 3 A 4 A A 2 2 2 3 3 3 Q 4 K J Q * * * * * * 
Jが出た
Jを取った

<32手目>
A 2 3 A 4 A A 2 2 2 3 3 3 Q 4 K Q * * * * * 
Qが出た
Qを取った

<33手目>
A 2 3 A 4 A A 2 2 2 3 3 3 Q 4 K * * * * 
Qが出た
Qを取った

<34手目>
A 2 3 A 4 A A 2 2 2 3 3 3 4 K * * * 
Kが出た
Kを取った

<35手目>
A 2 3 A 4 A A 2 2 2 3 3 3 4 * * 
Kが出た
Kが出た
Kを取った

<36手目>
A 2 3 A 4 A A 2 2 2 3 3 3 4 
Aを取った

<37手目>
A 2 3 A 4 2 2 2 3 3 3 4 
Aを取った

<38手目>
2 3 4 2 2 2 3 3 3 4 
2を取った

<39手目>
2 3 4 2 3 3 3 4 
2を取った

<40手目>
3 4 3 3 3 4 
3を取った

<41手目>
3 4 3 4 
3を取った

<42手目>
4 4 
4を取った



Create a new paste based on this one


Comments: