猜数字项目最简算法,比谁的程序猜测总次数最少
本人新的不能再新的小萌新一只,恳请各位大佬帮我解决下这个问题,感激涕零;
以下为原题:
猜数字,计算机随机生成1个3或4位的十进制整数,各个数位上的数字各不相同,用户给出猜测,计算机回答XAYB(X个位置和数字猜中,Y个数字猜中但位置错误),重复用户猜计算机回答的过程,直到猜中为止(3A0B,4A0B)。
现给出原码,要求计算机随机生成1个3或4位的十进制整数,各个数位上的数字各不相同,由计算机来猜测,比谁的程序猜测的总次数最少。
以下为原码 (需要完成的是函数int guess(int A,int B))
#include <stdio.h>
#include <stdlib.h>
#define M 4 //猜几个数字
//交换
void swap(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}
//将数组随机打乱
void random_shuffle(int* a,int n)
{
int i;
for(i=0;i<n;i++)
{
int x=rand()%n;
int y=rand()%n;
if(x!=y) swap(a+x,a+y);
}
}
//生成数位不重复的M位全部数据,存在数组a中,并打乱,备用
int gen(int* a)
{
int count=0,i,j;
int max=1;
for(i=0;i<M;++i,max*=10);
for(i=0;i<max;++i)
{
_Bool flag[10]={0};
int t=i;
for(j=0;j<M;++j)
if(flag[t%10]) break;
else flag[t%10]=1,t/=10;
if(j==M)
a[count++]=i;
}
random_shuffle(a,count);
return count;
}
void test(int answer,int player,int* A,int* B)
{
int i=0,j;
int answer_a[M]={0},player_a[M]={0};
*A=*B=0;
while(answer||player)
{
answer_a[i]=answer%10;
player_a[i++]=player%10;
answer/=10;
player/=10;
}
for(i=0;i<M;++i)
for(j=0;j<M;++j)
if(player_a[i]==answer_a[j])
if(i==j) ++*A;
else ++*B;
}
//参数AB是上一轮猜测的反馈,
//如果得到猜中的信息表示下一把的开始
int guess(int A,int B)
{
//你的工作在这个函数
int x;
scanf("%d",&x);
return x;
}
int main()
{
srand(2);
int i;
//初始生成数据
int len;
for(len=1,i=0;i<M;++i)
len*=10-i;
int a[len];
gen(a);
//开玩
int n=1;//玩n把
int count=0;//总猜测次数
while(n--)
{
//每把从猜中开始,例如玩4个数,4A0B为猜中,
//此时进入下一把,会有新的数供猜测
//printf("%d\n",a[n]);
int A=M,B=0;
int count_cur=0;
do
{
int player=guess(A,B);
++count_cur;
test(a[n],player,&A,&B);
printf("%d:%0*d,%dA%dB\n",count_cur,M,player,A,B);
}while(A!=M||B);
count+=count_cur;
}
return 0;
}
以下为原题:
猜数字,计算机随机生成1个3或4位的十进制整数,各个数位上的数字各不相同,用户给出猜测,计算机回答XAYB(X个位置和数字猜中,Y个数字猜中但位置错误),重复用户猜计算机回答的过程,直到猜中为止(3A0B,4A0B)。
现给出原码,要求计算机随机生成1个3或4位的十进制整数,各个数位上的数字各不相同,由计算机来猜测,比谁的程序猜测的总次数最少。
以下为原码 (需要完成的是函数int guess(int A,int B))
#include <stdio.h>
#include <stdlib.h>
#define M 4 //猜几个数字
//交换
void swap(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}
//将数组随机打乱
void random_shuffle(int* a,int n)
{
int i;
for(i=0;i<n;i++)
{
int x=rand()%n;
int y=rand()%n;
if(x!=y) swap(a+x,a+y);
}
}
//生成数位不重复的M位全部数据,存在数组a中,并打乱,备用
int gen(int* a)
{
int count=0,i,j;
int max=1;
for(i=0;i<M;++i,max*=10);
for(i=0;i<max;++i)
{
_Bool flag[10]={0};
int t=i;
for(j=0;j<M;++j)
if(flag[t%10]) break;
else flag[t%10]=1,t/=10;
if(j==M)
a[count++]=i;
}
random_shuffle(a,count);
return count;
}
void test(int answer,int player,int* A,int* B)
{
int i=0,j;
int answer_a[M]={0},player_a[M]={0};
*A=*B=0;
while(answer||player)
{
answer_a[i]=answer%10;
player_a[i++]=player%10;
answer/=10;
player/=10;
}
for(i=0;i<M;++i)
for(j=0;j<M;++j)
if(player_a[i]==answer_a[j])
if(i==j) ++*A;
else ++*B;
}
//参数AB是上一轮猜测的反馈,
//如果得到猜中的信息表示下一把的开始
int guess(int A,int B)
{
//你的工作在这个函数
int x;
scanf("%d",&x);
return x;
}
int main()
{
srand(2);
int i;
//初始生成数据
int len;
for(len=1,i=0;i<M;++i)
len*=10-i;
int a[len];
gen(a);
//开玩
int n=1;//玩n把
int count=0;//总猜测次数
while(n--)
{
//每把从猜中开始,例如玩4个数,4A0B为猜中,
//此时进入下一把,会有新的数供猜测
//printf("%d\n",a[n]);
int A=M,B=0;
int count_cur=0;
do
{
int player=guess(A,B);
++count_cur;
test(a[n],player,&A,&B);
printf("%d:%0*d,%dA%dB\n",count_cur,M,player,A,B);
}while(A!=M||B);
count+=count_cur;
}
return 0;
}
...全文
相关推荐
Java实现猜数字小游戏(有次数限制)
主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
PTA-猜数字游戏
猜数字游戏 猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bi...
基于换乘次数最少的公交线路查询算法
基于换乘次数最少的公交线路查询算法,想了解公交的换乘查询算法的可以下来看看,特别是对做公交查询软件的人及其有用!
猜数字游戏_时间判断_次数判断
时间与游戏同步~当时间停止游戏结束,当游戏猜对,时间停止!
编写一个猜数字游戏的程序代码
编一个猜数字程序代码,如果猜错了,返回继续猜,猜对了,编写恭喜你猜对了!



