此文纯属个人爱好,不具任何可推广性,慎入,欢迎玩。

这是一个比较经典的益智游戏,叫做猜数字,很多人从小都在文曲星里玩过这游戏。

游戏规则:文曲星内部会产生四个不同的有序的一位数(1-9),我们对这四个数字进行猜测,每次猜测四个数字(包括了顺序),文曲星会返回A,B两个值,A代表我们猜的数字中正确数字的个数,B代表猜的数字中不仅正确而且处于正确位置上的数字的个数。如文曲星内部产生的是4327,我们猜1324,则A=3,表示3,2,4这3个数字是正确的,B=2,表示2,3这2个数字不仅正确还处于正确的位置。

游戏任务:最少次数地猜出文曲星内部的四个有序数字。

这里给出了一个通过逻辑判断,对任何情况至多6步可以猜出来的算法实现。根据有关资料的说明,6步内猜出所有情况貌似是这个游戏最快的结果。

算法:主要是复杂的逻辑判断。基本的想法是先在六步里判断出是哪4个数字,然后一次性根据前面积累的B值判断出正确的位置(如果此时有多个选择则选择其中之一输出,然后根据这次输出的反馈再判断)。

问题的关键是设置什么算法可以再六步内判断出这四个数字?这里给出的是,前三步总是做固定的猜测,分别是“1,2,3,4”,“2,1,5,6”,“7,8,1,2”, 设每次得到的A反馈分别为A1,A2,A3,然后根据sum=A1+A2+A3的值来做判断。显然sum>=3,因为没被猜得只有9。如果sum为3,那么9必然在其中,1,2必不在其中,然后可跟别根据A1,A2,A3的值来判断3,4,5,6,7,8 (当然还要更一步判断)。如果sum为4,这四个数必然为3,4,5,6,7,8 中的4个。。。当然如果你有兴趣,可以对其他的试着做类似的逻辑判断,建立在这些判断之下然后再进一步决定下面猜测什么。

这里给出一个C++实现的代码,欢迎测试。代码里能看清楚具体怎么根据sum的和来判断,以及怎么根据判断结果继续猜。如果你想让计算机猜的是8327,那么下面是执行的一个界面(比较粗糙,没好好做界面):

  

// a test.cpp : Defines the entry point for the console application.//

#include "stdafx.h"# include <math.h>#include <stdio.h># define TRUE 1# define FALSE 0# define OK 1 typedef int Status;

void Read(int &a,int &b){  // 读入数据    printf("please input the values of A,B:");    scanf_s("%d%d",&a,&b);return ;}void Putout(int a[4]){   //  输出数据    int i;for(i=0;i<4;i++)         printf("%d ",a[i]);    printf("\n");}

 Status Judje(int a[10][4],int b[10][2],int c[4]){   int k=0,i,j,sum=0;

for(j=0;j<10;j++)    {if(a[j][0]==0)             sum++;else        {            k=0;for(i=0;i<4;i++) if(a[j][i]==c[i]) k++;if(k==b[j][1])             sum++;        }    }if(sum==10) return OK;else return FALSE;

}

Status little(int a[4]){  ´int i,j,k=0;

for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[i]==a[j]) k++;

if(k>4) return FALSE;else return OK;}

void Produce(int c[4],int a[10][4],int b[10][2]){ // 输出最终结果    int i=0,j[4],d[4];while(a[i][0]!=0) i++;

for(j[0]=0;j[0]<4;j[0]++)for(j[1]=0;j[1]<4;j[1]++)for(j[2]=0;j[2]<4;j[2]++)for(j[3]=0;j[3]<4;j[3]++)             {if(b[i-1][1]!=4)                   {                     d[0]=c[j[0]]; d[1]=c[j[1]]; d[2]=c[j[2]]; d[3]=c[j[3]];if(little(d)&&Judje(a,b,d))                       {                          a[i][0]=d[0];a[i][1]=d[1];a[i][2]=d[2];a[i][3]=d[3];                         Putout(a[i]);                         Read(b[i][0],b[i][1]);                         i++;                    }                }else                 {                    printf("Right Answer! Thank You To Play!\n");return;                 }             }    printf("Your Input is wrong!\n");return;

    }

int _tmain(int argc, _TCHAR* argv[]){int j,i=0,b[10][2]={0};int a[10][4]={0};int    sum=0,c[4]={0};  char w;      printf("think about 4 ordered and different digits and enter 's' to start:");         scanf_s("%c",&w);     a[0][0]=1;a[0][1]=2;a[0][2]=3;a[0][3]=4;        Putout(a[0]);     Read(b[0][0],b[0][1]);if(b[0][0]==4&&b[0][1]==4)         {                printf("Right Answer! Thank You To Play!\n");return 0;        }

if(b[0][0]==4&&b[0][1]!=4)        {for(i=0;i<4;i++) c[i]=a[0][i];            Produce(c,a,b);return 0;        }            sum=sum+b[0][0];

         a[1][0]=2;a[1][1]=1;a[1][2]=5;a[1][3]=6;         Putout(a[1]);            Read(b[1][0],b[1][1]);if(b[1][0]==4&&b[1][1]==4)         {            printf("Right Answer! Thank You To Play!\n");return 0;        }

if(b[1][0]==4&&b[1][1]!=4)        {for(i=0;i<4;i++) c[i]=a[1][i];             Produce(c,a,b);return 0;        }            sum=sum+b[1][0];

        a[2][0]=7;a[2][1]=8;a[2][2]=1;a[2][3]=2;         Putout(a[2]);        Read(b[2][0],b[2][1]);if(b[2][0]==4&&b[2][1]==4)             {                printf("Right Answer! Thank You To Play!\n");return 0;            }

if(b[2][0]==4&&b[2][1]!=4)        {for(i=0;i<4;i++) c[i]=a[2][i];                Produce(c,a,b);return 0;        }            sum=sum+b[2][0];

//do logical judgement according to the 3 results above            switch(sum)    {case 3:      c[0]=9;

if(b[0][0]==b[1][0]&&b[1][0]==b[2][0])      {          a[3][0]=9;a[3][1]=3;a[3][2]=5;a[3][3]=7;              Putout(a[3]);           Read(b[3][0],b[3][1]);

if(b[3][0]==4) break;

           a[4][0]=3;a[4][1]=4;a[4][2]=5;a[4][3]=8;           Putout(a[4]);           Read(b[4][0],b[4][1]);

if(b[3][0]-b[4][0]==2&&b[3][0]==3)            {               c[1]=3;c[2]=6;c[3]=7;           }if(b[3][0]-b[4][0]==1&&b[3][0]==3)            {               c[1]=4;c[2]=5;c[3]=7;           }if(b[3][0]-b[4][0]==1&&b[3][0]==2)            {               c[1]=4;c[2]=6;c[3]=7;           }if(b[3][0]-b[4][0]==0&&b[3][0]==3)           {               c[1]=3;c[2]=5;c[3]=8;           }if(b[3][0]-b[4][0]==0&&b[3][0]==2)           {               c[1]=4;c[2]=6;c[3]=7;           }if(b[3][0]-b[4][0]==-1&&b[3][0]==2)           {               c[1]=4;c[2]=5;c[3]=8;           }if(b[3][0]-b[4][0]==-1&&b[3][0]==1)            {               c[1]=4;c[2]=6;c[3]=8;           }      }else{          a[3][0]=9;for(j=0;j<3;j++)          {if(b[j][0]==2)              {                  a[3][1]=c[1]=2*j+3; a[3][2]=c[2]=2*j+4;              }if(b[j][0]==1) a[3][3]=c[3]=2*j+3;          }          Putout(a[3]);          Read(b[3][0],b[3][1]);if(b[3][0]==3)           {              c[3]=c[3]+1;break;          }      }break;

case 4:          i=0;for(j=0;j<3;j++)if(b[j][0]==2)              {                c[i]=2*j+3; c[i+1]=2*j+4;i=i+2;              }if(i==4) break;

         a[3][1]=c[0];a[3][0]=c[1];for(j=0;j<3;j++)if(b[j][0]==1)                  {                     a[3][i]=c[i]=2*j+3;                     i=i+1;                 }          Putout(a[3]);          Read(b[3][0],b[3][1]);

if(b[3][0]==4) break;if(b[3][0]==2)          {              c[3]=c[3]+1;              c[2]=c[2]+1;break;          }          c[2]=a[4][0]=a[3][2]+1;a[4][1]=a[3][3];a[4][2]=a[3][1];a[4][3]=a[3][0];           Putout(a[4]);          Read(b[4][0],b[4][1]);

if(b[4][0]==4) break;else          {              c[2]=c[2]-1;c[3]=c[3]+1;break;          }

case 5:      c[0]=a[3][0]=9;i=1;for(j=0;j<3;j++)      {if(b[j][0]==3)              {                c[i]=a[3][i]=2*j+3; c[i+1]=a[3][i+1]=2*j+4;                a[3][3]=1;                Putout(a[3]);                Read(b[3][0],b[3][1]);if(b[3][0]==4) break;

if(b[3][0]==3)                {                   c[3]=2;break;                }              }

if(b[j][0]==2)              {                 c[i]=a[3][i]=2*j+3;                  i=i+1;              }      }       c[3]=a[3][3]=1;       Putout(a[3]);       Read(b[3][0],b[3][1]);if(b[3][0]==4) break;

       a[4][0]=a[3][2]+1;a[4][3]=a[3][1];a[4][1]=1;a[4][2]=2;        Putout(a[4]);        Read(b[4][0],b[4][1]);if(b[3][0]-b[4][0]==2&&b[3][0]==3)           {               c[1]=1;c[2]=a[3][1]+1;c[3]=a[3][2];           }if(b[3][0]-b[4][0]==1&&b[3][0]==3)            {               c[1]=2;c[2]=a[3][1];c[3]=a[3][2];                   ;           }if(b[3][0]-b[4][0]==1&&b[3][0]==2)            {               c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2];           }if(b[3][0]-b[4][0]==0&&b[3][0]==3)           {               c[1]=1;c[2]=a[3][1];c[3]=a[3][2]+1;           }if(b[3][0]-b[4][0]==0&&b[3][0]==2)           {               c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2];           }if(b[3][0]-b[4][0]==-1&&b[3][0]==2)           {               c[1]=2;c[2]=a[3][1];c[3]=a[3][2]+1;           }if(b[3][0]-b[4][0]==-1&&b[3][0]==1)            {               c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2]+1;           }break;

case 6:            i=0;for(j=0;j<4;j++)if(b[j][0]==2) i++;if(i==3)                {                   c[0]=a[3][0]=9;c[1]=a[3][1]=3;c[2]=a[3][2]=5;c[3]=a[3][3]=7;                   Putout(a[3]);                   Read(b[3][0],b[3][1]);                   a[4][0]=3;a[4][1]=4;a[4][2]=5;a[4][3]=8;                   Putout(a[4]);                   Read(b[4][0],b[4][1]);if(b[3][0]-b[4][0]==1&&b[3][0]==2)                         {                              c[1]=3;c[2]=6;c[3]=7;                        }if(b[3][0]-b[4][0]==0&&b[3][0]==1)                        {                              c[1]=4;c[2]=5;c[3]=7;                        }if(b[3][0]-b[4][0]==0&&b[3][0]==1)                         {                               c[1]=4;c[2]=6;c[3]=7;                        }if(b[3][0]-b[4][0]==-1&&b[3][0]==2)                         {                                c[1]=3;c[2]=5;c[3]=8;                         }if(b[3][0]-b[4][0]==-1&&b[3][0]==1)                         {                                c[1]=4;c[2]=6;c[3]=7;                        }if(b[3][0]-b[4][0]==-2&&b[3][0]==1)                         {                                c[1]=4;c[2]=5;c[3]=8;                        }if(b[3][0]-b[4][0]==-2&&b[3][0]==0)                         {                                 c[1]=4;c[2]=6;c[3]=8;                        }                    c[0]=1;for(j=0;j<4;j++)                         a[5][j]=c[j];                    Putout(a[5]);                    Read(b[5][0],b[5][1]);if(b[5][0]==4) break;else                     {                            c[0]=2;break;                     }             }else{for(j=0;j<3;j++)if(b[j][0]==3)                   {                        a[3][1]=c[1]=2*j+3;     a[3][2]=c[2]=2*j+4;                   }for(j=0;j<3;j++)if(b[j][0]==2)                       a[3][3]=c[3]=2*j+3;            a[3][0]=c[0]=1;           Putout(a[3]);           Read(b[3][0],b[3][1]);if(b[3][0]==4) break;if(b[3][0]==2)           {              c[0]=2;c[3]=c[3]+1;break;           }       a[4][0]=c[0]=a[3][0]+1;   a[4][3]=a[3][1];   a[4][1]=a[3][2];    a[4][2]=a[3][3];         Putout(a[4]);          Read(b[4][0],b[4][1]);if(b[4][0]==4)break;if(b[4][0]==2)           {              c[0]=1;c[3]=c[3]+1;break;           }          }

case 7:               c[0]=a[3][1]=1;c[1]=a[3][2]=2;c[2]=a[3][0]=9;for(j=0;j<3;j++)if(b[j][0]==3)                      a[3][3]=c[3]=2*j+3;           Putout(a[3]);           Read(b[3][0],b[3][1]);if(b[3][0]==4)break;if(b[3][0]==3)           {              c[3]=c[3]+1;break;           }

case 8:           c[0]=a[3][3]=1;c[1]=a[3][2]=2;for(j=0;j<3;j++)if(b[j][0]==4)               {                   a[3][3]=c[2]=2*j+3;a[3][0]=c[3]=2*j+4;break;              }        i=0;for(j=0;j<3;j++)if(b[j][0]==3)                  {                     a[3][i]=c[i+2]=2*j+3;                     i=i+1;                  }          Putout(a[3]);          Read(b[3][0],b[3][1]);if(b[3][0]==4) break;if(b[3][0]==2)               {              c[3]=c[3]+1;              c[2]=c[2]+1;break;          }          c[2]=a[4][2]=a[3][0]+1;        a[4][1]=a[3][3];     a[4][0]=a[3][1];      a[4][3]=a[3][2];           Putout(a[4]);          Read(b[4][0],b[4][1]);if(b[4][0]==4) break;else             {              c[2]=c[2]-1;c[3]=c[3]+1;break;          }default:printf("ERROR input!"); break;}    

Produce(c,a,b);scanf_s("%d",&j);

}

转载于:https://www.cnblogs.com/rosting/archive/2011/11/15/2249590.html

文曲星猜数字游戏6步算法(含代码)相关推荐

  1. python猜数字代码_Python版的文曲星猜数字游戏代码

    # -*- coding: utf-8 -*- import random #数字类 class NumberItem: #数字个数 _GUESS_NUMBER_COUNT_ = 4 def __in ...

  2. python3.3使用tkinter实现猜数字游戏代码

    发布时间:2014-06-18   编辑:www.jbxue.com 原文地址:http://www.jbxue.com/article/python/22152.html python3.3使用tk ...

  3. 【C语言】-猜数字游戏

    目录 一.猜数字游戏 1.什么是猜数字游戏? 2.怎么实现猜数字游戏? 1>.分析需要的功能 2>.随机数的产生 3>.system()函数 4>.总代码 二.猜数字游戏+关机 ...

  4. java 文曲星猜数字,「3D跨度表」文曲星中的猜数字游戏,要猜一个四位数,有什么通用公式?...

    大家好,本文问题是「3D跨度表」文曲星中的猜数字游戏,要猜一个四位数,有什么通用公式?,由专家五湖彩解答.下面是具体回答内容: 算法:主来要是复杂的逻辑判断.基自本的想法是先在六bai步里判断出是哪d ...

  5. 用二分法编写猜数字游戏(含:猜电脑随机数,和用户自己想的数字)python

    目录 #什么是二分法 #用二分法猜电脑随机数 #用二分法猜用户所想的数 1.什么是二分法? 对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点 ...

  6. python数字组合算法_python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

  7. 算法题目-猜数字游戏

    算法题目: 设计一个猜数字游戏的java程序,数字为50到150之间的一个整数,由程序随机生成,程序使用者从键盘输入. 如果大了,提示"猜大了" 如果小了,提示"猜小了& ...

  8. python写一个游戏多少代码-Python项目实战之猜数字游戏(含实现代码)

    猜数字游戏,旨在提高初学者对 Python 变量类型以及循环结构的使用. 此游戏的游戏规则如下:程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字.用户每猜测一次,由系统提示猜测结果 ...

  9. C语言 猜数字游戏 (含代码并详细注释)

    猜数字游戏实现 通过不断输入一个数字,经过给出的提示,去猜到系统给出的随机数 #include<stdio.h> #include<stdlib.h> #include< ...

最新文章

  1. s5 android5.0内存泄漏,android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)...
  2. 5G NGC — PCF 策略控制功能
  3. Tiled 瓦片地图
  4. 机器学习领域必知必会的12种概率分布(附Python代码实现)
  5. inode directory
  6. python 石头剪刀布,Python石头剪刀布完整代码
  7. Java集合系列---LinkedHashMap源码解析
  8. java工厂模式学习
  9. Spring Cloud教程 (二)应用程序上下文服务层次结构
  10. 使用 Pig 进行数据分析
  11. lpc1788 ds18b20
  12. EXCEL合并单元格自动行高
  13. seaborn系列 (10) | 盒形图boxplot()
  14. 用project做项目计划及总结报表
  15. 【Unity】3D雷霆战机
  16. linux怎么加块硬盘,如何在Linux下添加第二块scsi硬盘?
  17. 什么是全屋定制家居概念?
  18. Web 3.0 :它是互联网的未来吗?
  19. java中的<<符号是什么意思
  20. Ubuntu 7.04--桌面

热门文章

  1. QT后台监控键盘和鼠标
  2. 体育开展教学测试的工具软件是什么,我国体育教师学科内容知识(CK)测评工具研制及其运用研究...
  3. L5W1作业1 手把手实现循环神经网络
  4. 13个人围成一圈,从第1个人开始顺序报号1,2,3。 凡报到3者退出圈子
  5. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-06:不同格式固件的区别:bin/hex/s37/gbl
  6. 什么是报关?什么是买单报关?
  7. 2020 年百度之星·程序设计大赛 - 初赛三-Discount
  8. 遗世蒹葭~小甲鱼~数据结构和算法_02~线性表
  9. CRecordset::GetRecordCount()
  10. 自媒体时代如何营销?自媒体推广投放新趋势