探究烏龜對對碰遊戲的最優策略

这题怎么写發表於2024-08-16

1.黑箱中有10種不同顏色的烏龜,保證他們個數始終足夠且相等。烏龜將由參與者抽出並填入編號為1-9的九宮格中,且優先填入數字小的格子。參與者開局擁有n次抽取的機會。
2.參與者開局自己確定一個幸運顏色,抽中幸運顏色即可再抽一次
3.當網格中一行或一列出現三隻顏色相同的烏龜,這三隻將被移出網格,參與者可再抽五次
4.當網格中任意兩個格子出現顏色相同的烏龜,這兩隻將被移出網格,參與者可再抽一次(三隻同色判斷優先順序大於兩隻同色)
5.當網格中沒有可移出的烏龜且參與者沒有抽取次數時,遊戲結束,所有離開黑箱的烏龜歸參與者所有

#include<bits/stdc++.h>
using namespace std;
unsigned zseed=time(0); 
mt19937_64 zgen{zseed};
struct UI
{
	uniform_int_distribution<int> u;
	mt19937_64& gen{zgen};
	int get()
	{
		return u(gen);
	}
	UI(int a=1,int b=10)
		: u{a,b}{}
};
int p[10];//將九宮格編號為1-9可以化為一維
int s,load;//load為待抽的,s為已抽的
int check3()//判斷三連
{
	int sum=0;
	if(p[1]==p[2]==p[3]&&p[1]!=0)
	{
		p[1]=p[2]=p[3]=0;
		sum++;
	}
	if(p[4]==p[5]==p[6]&&p[4]!=0)
	{
		p[4]=p[5]=p[6]=0;
		sum++;
	}
	if(p[7]==p[8]==p[9]&&p[7]!=0)
	{
		p[7]=p[8]=p[9]=0;
		sum++;
	}
	if(p[1]==p[4]==p[7]&&p[1]!=0)
	{
		p[1]=p[4]=p[7]=0;
		sum++;
	}
	if(p[2]==p[5]==p[8]&&p[2]!=0)
	{
		p[2]=p[5]=p[8]=0;
		sum++;
	}
	if(p[3]==p[6]==p[9]&&p[3]!=0)
	{
		p[3]=p[6]=p[9]=0;
		sum++;
	}
	if(p[1]==p[5]==p[9]&&p[1]!=0)
	{
		p[1]=p[5]=p[9]=0;
		sum++;
	}
	if(p[3]==p[5]==p[7]&&p[3]!=0)
	{
		p[3]=p[5]=p[7]=0;
		sum++;
	}
	return sum;
}
int check2()//判斷對對碰
{
	int sum=0;
	for(int i=1;i<=9;i++)
	for(int j=1;j<=9;j++)
	{
		if(p[i]==p[j]&&p[i]!=0)
		{
			sum++;
			p[i]=p[j]=0;
		}
	}
	return sum;
}
int main()
{
	
	freopen("data.txt","w",stdout);
	UI u{1,10};
	int i=100000;//模擬十萬次
	while(i--)
	{
		int luck=u.get();//u.get()產生[1,10]中的隨機整數
		int j=1;
		load=18;s=0;//開局有18次抽取機會
		while(1)
		{
			j=1;
			while(p[j]!=0)j++;
			while(j!=9)
			{
				if(p[j]==0)
				{
					if(load>0)
					{
						p[j]=u.get();
						if(p[j]==luck)load++;
						j++;load--;s++;
					}
				}
				else j++;
				
				if(load==0)break;
			}
			if(check3()!=0)load+=5*check3();
			if(check2()!=0)load+=check2();
			if(load==0&&check2()==0&&check3()==0)break;
			else
			{
				if(check3()!=0)load+=5*check3();
				if(check2()!=0)load+=check2();
			}
		}
		for(int k=1;k<=9;k++)
		if(p[k]!=0)s++;
		printf("%d ",s);
		memset(p,0,sizeof(p)); 
	}
} 
from collections import Counter  #c++產生資料,python統計個數出現頻率並繪製影像
import matplotlib.pyplot as plt  

# 讀取資料檔案並初始化Counter物件
with open('data.txt', 'r') as file:
    lines = file.readlines()

# 將所有行的數字合併到一個列表中,並轉換為整數
all_numbers = [int(num) for line in lines for num in line.split()]

# 使用Counter統計頻次
freq_counter = Counter(all_numbers)

# 計算總的數字數量和均值
total_numbers = sum(freq_counter.values())
mean_value = sum(all_numbers) / total_numbers

# 列印每個數字及其頻率和均值
for number, frequency in freq_counter.items():
    frequency_percentage = (frequency / total_numbers) * 100
    print(f"Number {number} appears with a frequency of {frequency_percentage:.2f}%")
print(f"The mean value is: {mean_value:.2f}")

# 使用matplotlib繪製條形圖
plt.figure(figsize=(10, 8))  # 可以調整圖形大小

# 繪製條形圖
bars = plt.bar(freq_counter.keys(), [(freq / total_numbers) * 100 for freq in freq_counter.values()], color='blue')

# 在圖表旁邊新增均值文字
plt.text(0.02, 0.95, f'Mean Value: {mean_value:.2f}',
         transform=plt.gca().transAxes,  # 將文字放在軸的座標系中
         fontsize=12, color='green',
         bbox=dict(facecolor='white', alpha=0.5, boxstyle='round'))

# 設定X軸和Y軸的標籤
plt.xlabel('Number')
plt.ylabel('Frequency (%)')

# 設定圖表標題
plt.title('Frequency Distribution of Numbers')

# 顯示圖表
plt.show()

相關文章