| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1914 人关注过本帖
标题:[求助]电脑怎样玩文曲星的猜数游戏?
只看楼主 加入收藏
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
 问题点数:0 回复次数:16 
[求助]电脑怎样玩文曲星的猜数游戏?
怎么解猜数字游戏?
想必文曲星大家都玩过吧, 那有个猜数字的游戏.
在十个数字0,1,2,3,4,5,6,7,8,9
文曲星会随即产生4个数让你来猜 你最多只有8次机会
例如 文曲星 随即产生 1234这四个排列好的四位数字
然后 让我猜
第一次 我输入 0123 那么 文曲星会返回 0A3B (xAxB A代表你猜中了多少个数字并且位置也是正确的,B代表你猜中了多少个数字但是位置是错误的),然后你根据0A3B这个信息 继续猜 直到猜对为止(即4A0B).
第一次我输了0123其中123是正确的,但是位置错了.所以文曲星会返回 0A3B .


就这样,每次输入4个数字 文曲星都会返回 xAxB 但你最多只能猜8次

我想请教一下 
如何编写一个算法,即用最少的步骤猜对这4个数

如果没有程序,也请把你的思路说下...
搜索更多相关主题的帖子: 文曲星 游戏 数字 
2006-06-21 19:25
x5471140
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-6-19
收藏
得分:0 
我认为可以用穷举法。
列举0123——9876中所有每位不同的四位数,依次与结果进行比对,输出所有符合条件的数。
但此方法并不能用最少的次数猜对。
2006-06-21 19:53
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
//猜电脑产生的四位数
//用VC++作为cpp编译:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int OK(int x,int a[4])
{ if(x<1000||x>9999)return 0;
for(int i=0;i<4;i++)
{ int t=x%10;x/=10;
for(int j=0;j<i;j++)
if(t==a[j])return 0;
a[i]=t;
} return 1;
}
void main()
{ srand(time(NULL));
//让电脑产生随机的四位数:
int X,A[4],m,n,cai=1;
do X=rand()%10000; while(!OK(X,A));
cout<<"四位猜数游戏开始"<<endl;
//让玩家不断猜测该四位数:
do{ int x,a[4],i,j;m=n=0;
do{ cout<<"第"<<cai<<"次: ";
cin>>x;}while(!OK(x,a));
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i]==A[j])
if(i==j)m++;else n++;
cout<<m<<"A"<<n<<"B"<<endl;cai++;
} while(m<4);
cout<<"恭喜您猜中了!";
}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-21 20:25
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 

这个文字游戏其实是最简单的一个游戏,程序中就是几个循环而已.发一下C的代码给LZ参考下.是以前写的.
================================================
#include<math.h>
#include<conio.h>
#include<stdio.h>

#define N 4

int
main(void)
{
int TheNum[N]={1,3,9,6};
int answer[N];
int i, j;
int PerfectNum ;
int RightNum ;
int time = 0;


printf("\n//------------------The Guess_number Game Begin-------------------//\n");

loop:
{
PerfectNum = 0;
RightNum = 0;
printf("\nPlease input the number you guess:\n");
for (i=0; i<N; i++)
{
window (10, 0, 40, 21);
scanf("%d",&answer[i]);
if (((answer[i] >= 'a') && (answer[i] <= 'z'))
|| ((answer[i] >= 'A') && (answer[i] <= 'Z')))
{
printf("You to quite!\n");
system("Pause");
exit (1);
}
}
}

for (i=0; i<N; i++)
{
if (answer[i] == TheNum[i])
{
PerfectNum++;
}
for (j=0;j<N;j++)
{
if ((answer[j] == TheNum[i]) && (i != j))
{
RightNum++;
}
}
}

time++;

printf("%dA%dB\n",PerfectNum,RightNum);
if ((PerfectNum == N) && (RightNum == 0))
{
printf("\nOh!!!Your answer is perfect!You try %d times!\n",time);
}
else
{
printf("//----->I am sorry you have to try agains.\n");
goto loop;
}

system("PAUSE");
return 0;
}


我的原则很简单:不做不喜欢的事!
2006-06-21 20:35
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用x5471140在2006-6-21 19:53:14的发言:
我认为可以用穷举法。
列举0123——9876中所有每位不同的四位数,依次与结果进行比对,输出所有符合条件的数。
但此方法并不能用最少的次数猜对。

要求最多8步


2006-06-21 22:05
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
感谢–★–,j_860603!

2006-06-21 22:06
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
不过,两位好象理解错了我的意思,我是说:
这个数是已产生的,要 求的是用最少的步骤得出这4个数,而不是产生这4个数(不是用程序产生的数字来考自己).

2006-06-21 22:18
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

这个程序是我在网上找到的:
// w.cpp : Defines the entry point for the console application.
//


#include <iostream.h>
#include <iomanip.h>

const int times=15; //总的次数(可变动数值范围)
const int Max=10; //可选的数字
const int len=4; //数字的选择量
const int tot=210; //组合情况的总数
const int position_cord=24; //每组数字的排列情况总数
const int position_Max=4; //每次待排数字总量
const int position_len=4; //每次排的数字量
int number[1][Max]; //组合设为二维数组以便日后改进
int cord[len]; //记录求组合时的中间变量
int total[tot][len]; //用于记录组合数
int maybe[tot]; //用于记录可能是答案的组合
int sum[tot]; //用于记录所有组合的结果
int p=0; //total的一维指针
int pmaybe=0; //maybe的一维指针
int count=0; //对任意组合的数量进行统计
int guess[times][len]; //记录每次猜的数字
int pguess=0; //guess的一维指针
int A[times]; //记录每次游戏的A指示
int position[position_Max]; //待排变量
int position_case[position_cord][position_len];//待排情况
int pcase=0; //情况指针

void Init()
{
p=0;//total的一维指针
pmaybe=0; //maybe的一维指针
count=0;//对任意组合的数量进行统计
pguess=0; //guess的一维指针
pcase=0;//情况指针
}

void Init_guess()
{
for (int i=0; i<times; i++)
{
for (int j=0; j<len; j++)
guess[i][j]=-1;
A[i]=-1;
}
}

void Init_maybe()
{
for (int i=0; i<tot; i++)
maybe[i]=-1;
pmaybe=0;
}

void Init_number()
{
for (int i=0; i<Max; i++)
number[0][i]=0;
}

void set(int m, int n)
{
int i;
if (m == len )
{
for (i=0; i<len; i++)
total[p][i]=cord[i];
count++;
p++;
}
else if ( n < Max)
{
for (i=0; i<2; i++)
{
if (i==0) { cord[m]=n; set(m+1,n+1); }
else set(m,n+1);
}
}
}

void order(int n)
{
int i, temp;
if (n == position_len)
{
for (i=0; i<position_len ;i++)
position_case[pcase][i]=position[i];
pcase++;
}
else
{
for (i=n; i<position_Max; i++)
{
temp=position[n]; position[n]=position[i]; position[i]=temp;
order(n+1);
temp=position[n]; position[n]=position[i]; position[i]=temp;
}
}
}

void condition(int sum, int pnum)
{
int sumk;
int temp;
Init_maybe();
for (int i=0; i<tot; i++)
{
sumk=0;
for (int j=0; j<len; j++)
{
temp=total[i][j];
sumk+=number[pnum][temp];
}
if (sumk == sum) { maybe[pmaybe]=i; pmaybe++; }
}
}

int answer(int sum, int pnum)
{
condition(sum, pnum);
pmaybe=0;
int i=0,j=0;
int temp;
while(1)
{
if (maybe[pmaybe] == -1) break;
i=maybe[pmaybe];
for (j=0; j<len; j++)
{
temp=total[i][j];
cout<<temp<<" ";
}
cout<<endl;
pmaybe++;
}
if (pmaybe >= 1) return 1;
return 0;
}

void sum_fun(int pnum)
{
int sumk, temp;
for (int i=0; i<tot; i++)
{
sumk=0;
for (int j=0; j<len; j++)
{
temp=total[i][j];
sumk+=number[pnum][temp];
}
sum[i]=sumk;
}
}

void set_number(int(* a)[len], int line)
{
int i, temp;
for (i=0; i<Max; i++)
number[0][i]=number[0][i]*10;
for (i=0; i<len; i++)
{
temp=a[line][i];
if (pguess < times ) guess[pguess][i]=a[line][i];
number[0][temp]++;
}
pguess++;
}

int position_order(int n, int pguess)
{
if (pguess>=0)
{
int c=0;
for (int i=0; i<len; i++)
if ( position_case[n][i] == guess[pguess][i]) c++;
if (c == 4) return 0;
if (c > A[pguess]) return 0;
return position_order(n,pguess-1);
}
else return 1;
}

int set_maybe(int sum)
{
condition(sum, 0);
int i=0, right=0;
int k=0;
for (pmaybe=0; pmaybe<tot; pmaybe++)
{
i=maybe[pmaybe];
for (int po=0; po<position_len; po++)
position[po]=total[i][po];
pcase=0;
order(0);
for (right=0; right<position_cord; right++)
if ( position_order(right,pguess-1) ) { k=1; break; }
if ( k==1 ) break;
}
if (pmaybe == tot) { cout<<"该题目无解"<<endl; return 0; }
set_number(position_case, right);
cout<<"请向游戏输入:";
for (int kk=0; kk<len; kk++)
cout<<position_case[align=right][kk]<<" ";
cout<<endl;
return 1;
}

void first()
{
int a[1][len], limit=0;
while(limit<len)
{
cout<<"请输入你第一次猜时的第"<<limit+1<<"个数字:";
cin>>a[0][limit];
if (a[0][limit] >=0 && a[0][limit]<Max) limit++;
else cout<<"输入数字不在范围内,请重输!"<<endl;
}
set_number(a, 0);
}


int fun()
{
Init();
Init_guess();
Init_number();
Init_maybe();
first();
int b=0;
int result=0;
set(0,0);
cout<<"总组合情况: "<<count<<endl;

cout<<"请输入游戏的第一次时A的提示情况:";
cin>>A[pguess-1];
if (A[pguess-1] == 4)
{
cout<<"\n谢谢使用本程序!"<<endl;
return 1;
}
cout<<"请输入游戏的第一次时B的提示情况:";
cin>>result;
result=result+A[pguess-1];
b=b*10+result;
cout<<"第一次提示情况下可能的组合:"<<endl;
for (int kk=2; kk<=times; kk++)
{
if (!answer(b,0) ) { cout<<"该题目无解"<<endl; break; }
cout<<endl;
set_maybe(b);

cout<<"请输入游戏的第"<<kk<<"次的A的提示情况:";
cin>>A[pguess-1];
if (A[pguess-1] == 4) break;

cout<<"请输入游戏的第"<<kk<<"次的B的提示情况:";
cin>>result;
result=result+A[pguess-1];
b=b*10+result;
cout<<"第"<<kk<<"次提示情况下可能的组合:"<<endl;
}
cout<<"\n谢谢使用本程序!"<<endl;
return 1;
}

void main()
{
char a;
do
{
fun();
cout<<"若输入#退出本程序:";
cin>>a;
cout<<endl<<endl;
}while (a != '#');
}
但是我不知道这个程序的思想,各位能不能解释这个程序的思路或提供自己的代码


2006-06-21 22:22
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

八楼程序原创者真乃高人,吾不及其万一也。
[默想]5296
[初始]1234
[结果]四次搞定!神。

if(流程图的鼓吹者们
将他的算法剖析清楚&&
绘制出八楼的流程图)
printf("I 服了 U");
else
printf("Shut up.");


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-22 08:07
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
收藏
得分:0 
数学好,就是好用

2006-06-22 11:16
快速回复:[求助]电脑怎样玩文曲星的猜数游戏?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018413 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved