探究乌龟对对碰游戏的最优策略

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()

posted @ 2024-08-16 15:46  这题怎么写  阅读(302)  评论(0)    收藏  举报