回 帖 发 新 帖 刷新版面

主题:[原创]就解猜数字问题(谁都会!)完美正式版

/************************************************************************
文件名:    解猜数字题
文件描述:  就解猜数字题
创建人:    陈泽丹,   2006年5月3日, (好惨,五一长假还忍不住心痒要编下程序,呵)
版本号:    1.0
修改次数:
************************************************************************/
/*-----------------------------------------------------------------------
问题描述:
随机给出一个数位上的数字不重复的四位数,让你猜,计算机每次给你提示这样的格
式的语句:xAyB (0<=x<=4, 0<=y<=4)
其中A表示数字正确位置也正确的,B表示数字正确位置不正确。
例如说: 1A2B  (表示1个数字正确位置也正确的,另有两个数字正确位置不正确)
现要求你编程尽可能在7次机会内猜出这个四位数。

解题思路:
把它分两步进行,1,先求这个四位数。2,再求这个四位数各位的
位置。另外,请注意,这两步是互相独立的子问题,故是可以同时进行解决的.

(好累,睡觉先了. 这么热心,要是还不能成精华贴, 那就太失人心喽,呵呵:)  )
------------------------------------------------------------------------*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
程序使用说明:
先对程序输入你第一次对游戏猜的那四个数.
再把游戏第一次的提示结果(A+B的和)告诉程序.
之后按程序说的办.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
#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;
    pmaybe=0;
    count=0;
    pguess=0;
    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[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()
{
    cout<<"程序名:  解猜数字游戏."<<endl;
    cout<<"程序描述:解猜数字游戏(模拟人的逻辑解题)"<<endl;
    cout<<"创建人:  陈泽丹.   (完成时间:2006年5月3号凌晨4点54分)"<<endl;
    cout<<"QQ:       82314038"<<endl;
    cout<<"\n大家可以上这个网址:http://home.kele8.com/flashgame/showgame.asp?id=10139"<<endl;
    cout<<"测试程序运行效果。程序游戏偶就不写了,要程序游戏是偶写,解程序的也是偶写,难免有投机"<<endl;
    cout<<"之嫌, 呵呵."<<endl;
    cout<<"\n题外话:  欢迎组队开发软件! ( 好了,快天光了,呵呵,该是偶睡觉的时侯了:) 各位早安 )"<<endl;
    cout<<"---------------------------------------------------------------------------------------------------"<<endl;
    char a;
    do
    {
        fun();
        cout<<"若输入#退出本程序:";
        cin>>a;
        cout<<endl<<endl;
    }while (a != '#');
}

回复列表 (共37个回复)

31 楼

#include "Guess.h"

int Guess::sort(int *c)
{
    int count[Max];
    int max_maybe[tot];
    int i=0;
    int j=0;
    int temp=0;
    int min=-1;
    pmaybe=0;
    while(1)
    {
        if (maybe[pmaybe] == -1) break;
        i=maybe[pmaybe];
        for (j=0; j<len; j++)
        {
            temp=total[i][j];
            count[temp]++;
        }
        pmaybe++;
    }
    pmaybe=0;
    while(1)
    {
        if (maybe[pmaybe] == -1) break;
        i=maybe[pmaybe];
        for (j=0; j<len; j++)
        {
            temp=total[i][j];
            max_maybe[i]+=count[temp];
        }
        if ( min==-1) min=i;
        if (max_maybe[i] <= max_maybe[min] && c[i]!=-1 ) min=i;
        pmaybe++;
    }
    return min;
}
void Guess::Init()
{
    p=0;
    pmaybe=0;
    count=0;
    pguess=0;
    pcase=0;
}

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

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

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

void Guess::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 Guess::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 Guess::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 Guess::answer(int sum, int pnum)
{
    condition(sum, pnum);
    pmaybe=0;
    int i=0,j=0;
    int temp;
    pmaybe=0;
    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 Guess::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 Guess::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 Guess::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 == len) return 0; 
        if (c > A[pguess]) return 0;
        return position_order(n,pguess-1);
    }
    else return 1;
}

int Guess::set_maybe(int sum)
{
    condition(sum, 0);
    int i=0, right=0;
    int k=0;
    int check[tot];
    cout<<"check:";
    for (int mm=0; mm<tot; mm++)
        check[mm]=0;
    for (pmaybe=0; pmaybe<tot; pmaybe++)
    {
        i=sort(check);
        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;
        check[i]=-1;
    }
    if (pmaybe == tot) { cout<<"该题目无解"<<endl; return 0; }
    set_number(position_case, right);
    cout<<"请向游戏输入:";
    for (int kk=0; kk<len; kk++)
        cout<<position_case[right][kk]<<" ";
    cout<<endl;
    return 1;
}

void Guess::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 Guess::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] == len) 
    { 
        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] == len) break;

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

void Guess::start()
{
    char a;
    do
    {
        cout<<"程序名:  解猜单词游戏."<<endl;
        cout<<"---------------------------------------------------------------------------"<<endl;
        fun();
        cout<<"若输入#退出本程序:";
        cin>>a;
        cout<<endl<<endl;
        system("cls");
    }while (a != '#');
}

32 楼

#include "Guess.h"

void main()
{
    Guess g;
    g.start();
}

33 楼

晕死,刚才作了个测试版的,发现第二版,无论我是先取可能情况最多的猜(博博机率),还是先取可能情况最少的猜(便于采用排除法), 猜中的机率都差不多...^-^!哈...
以下是测试版的程序...

34 楼

#ifndef HEADER_GUESS
#define HEADER_GUESS

/************************************************************************
文件名:    解猜数字题
文件描述:  就解猜数字题
创建人:    陈泽丹,   2006年6月6日
版本号:    3.0
修改次数:  3
************************************************************************/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
程序使用说明:
先对程序输入你第一次对游戏猜的那四个数.
再把游戏第一次的提示结果(A+B的和)告诉程序.
之后按程序说的办.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include <iostream.h>
#include <iomanip.h>
#include <windows.h>
#include <stdlib.h>
#include <time.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;                      //每次排的数字量

const int test_count=500;    //测试次数(可任意修改,当然不能负数喽)
const int kinds=16;

class Guess
{
private:

    int number[1][Max];                                //组合设为二维数组以便日后改进
    int cord[len];                                    //记录求组合时的中间变量
    int total[tot][len];                            //用于记录组合数
    int maybe[tot];                                    //用于记录可能是答案的组合
    int sum[tot];                                    //用于记录所有组合的结果
    int p;                                            //total的一维指针
    int pmaybe;                                        //maybe的一维指针
    int count;                                        //对任意组合的数量进行统计
    int guess[times][len];                            //记录每次猜的数字
    int pguess;                                        //guess的一维指针
    int A[times];                                    //记录每次游戏的A指示
    int position[position_Max];                        //待排变量
    int position_case[position_cord][position_len];    //待排情况
    int pcase;                                        //情况指针
    void Init();
    void Init_guess();
    void Init_maybe();
    void Init_number();
    void set(int m, int n);
    void order(int n);
    int sort(int *c);
    void condition(int sum, int pnum);
    int     answer(int sum, int pnum);
    void sum_fun(int pnum);
    void set_number(int(* a)[len], int line);
    int  position_order(int n, int pguess);
    int  set_maybe(int sum);
    void first();
    int  fun();


    int ii[kinds];
    int tt[1][4];
    int aa;
    int bb;
    void random(int (*tt)[len], int line);
    void input(int(* position_case)[position_len], int right);
public:
    Guess();
    void start();
};

inline Guess::Guess():p(0), pmaybe(0), count(0), pguess(0), pcase(0),aa(0),bb(0) {}

#endif

35 楼

#include "Test.h"

void Guess::input(int(* position_case)[position_len], int right)
{
    int ax;
    int bx;
    ax=bx=0;

    for(int i = 0; i < position_len; i++)
        for(int j = 0; j < position_len; j++)
            if(tt[0][i] == position_case[right][j])
            {
                if (i == j)        ax++;
                else    bx++;
            }
//    cout<<"A: "<<ax<<endl;
//    cout<<"B: "<<bx<<endl;
    aa=ax;
    bb=bx;
}
void Guess::random(int (*tt)[len], int line)
{
    set(0,0);
    order(0);
    int temp=rand()%tot;
    for (int i=0; i<len; i++)
    {
        tt[0][i]=total[temp][i];
//        cout<<tt[0][i]<<" ";
    }
//    cout<<endl;

    Init();
    Init_guess();
    Init_number();
    Init_maybe();
}
int Guess::sort(int *c)
{
    int count[Max];
    int max_maybe[tot];
    int i=0;
    int j=0;
    int temp=0;
    int max=-1;
    pmaybe=0;
    while(1)
    {
        if (maybe[pmaybe] == -1) break;
        i=maybe[pmaybe];
        for (j=0; j<len; j++)
        {
            temp=total[i][j];
            count[temp]++;
        }
        pmaybe++;
    }
    pmaybe=0;
    while(1)
    {
        if (maybe[pmaybe] == -1) break;
        i=maybe[pmaybe];
        for (j=0; j<len; j++)
        {
            temp=total[i][j];
            max_maybe[i]+=count[temp];
        }
        if ( max==-1) max=i;
        if (max_maybe[i] >= max_maybe[max] && c[i]!=-1 ) max=i;
        //注意这里的等号很必要,因极可能“出现值”相等,而因子不一样的。
        pmaybe++;
    }
    return max;
}
void Guess::Init()
{
    p=0;
    pmaybe=0;
    count=0;
    pguess=0;
    pcase=0;
}

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

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

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

void Guess::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 Guess::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 Guess::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 Guess::answer(int sum, int pnum)
{
    condition(sum, pnum);
    pmaybe=0;
    int i=0,j=0;
    int temp;
    pmaybe=0;
    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 Guess::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 Guess::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 Guess::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 == len) return 0; 
        if (c > A[pguess]) return 0;
        return position_order(n,pguess-1);
    }
    else return 1;
}

int Guess::set_maybe(int sum)
{
    condition(sum, 0);
    int i=0, right=0;
    int k=0;
    int check[tot];
    for (int mm=0; mm<tot; mm++)
        check[mm]=0;
    for (pmaybe=0; pmaybe<tot; pmaybe++)
    {
        i=sort(check);
//        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;
        check[i]=-1;
    }
    if (pmaybe == tot) { cout<<"该题目无解"<<endl; return 0; }
    set_number(position_case, right);
    cout<<"请向游戏输入: ";
    for (int kk=0; kk<len; kk++)
        cout<<position_case[right][kk]<<" ";
//    cout<<endl;
    input(position_case, right);
    return 1;
}

void Guess::first()
{
    for (int mm=0; mm<10000; mm++); //延时
    int b[1][len];
    random(b, 0);                //+
    int a[1][len], limit=0;

    cout<<"请向游戏输入: ";
    while(limit<len)
    {
//        cout<<"请输入你第一次猜时的第"<<limit+1<<"个数字:";
//        cin>>a[0][limit];
        
        
        a[0][limit]=b[0][limit]; //+
        cout<<a[0][limit]<<" ";         //+

        if (a[0][limit] >=0 && a[0][limit]<Max) limit++;
        else cout<<"输入数字不在范围内,请重输!"<<endl;
    }
    set_number(a, 0);

    input(a,0); //+
}


int Guess::fun()
{
    Init();
    Init_guess();
    Init_number();
    Init_maybe();
    random(tt,0);
    
    cout<<"随机产生数字:";   //+
    for (int mm=0; mm<len; mm++)  //+
        cout<<tt[0][mm]<<" ";     //+
    cout<<endl<<endl;                      //+

    int kk=1; //+

    first();
                      //+
    int b=0;
    int result=0;
    set(0,0);
//    cout<<"总组合情况: "<<count<<endl;

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

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

//      cout<<"请输入游戏的第"<<kk<<"次的B的提示情况:";
//      cin>>result;

        result=bb; //+
        result=result+A[pguess-1];
        b=b*10+result;
//      cout<<"第"<<kk<<"次提示情况下可能的组合:"<<endl;
    }
//    cout<<"\n谢谢使用本程序!"<<endl; 
    ii[kk]++; //+
    return 1;
}

void Guess::start()
{
    srand(time(0));
    int i=0;
    int j=0;

    for (j=0; j<kinds; j++)
        ii[j]=0;
//  char a;
    do
    {
//        do
//        {
        cout<<"程序名:  解猜数字游戏."<<endl;
        cout<<"---------------------------------------------------------------------------"<<endl;
        fun();
//      cout<<"若输入#退出本程序:";
//      cin>>a;
        cout<<endl<<endl;
//        system("cls");
//        }while (a != '#');
        i++;
    }while(i<test_count);

    cout<<"共进行"<<test_count<<"次测试:"<<endl;
    for (j=1; j<kinds; j++)
    {
        cout<<setw(4)<<j<<"次: "<<setw(4)<<ii[j]<<"  ";
        cout<<setw(8)<<(double)ii[j]/test_count*100<<"%  "<<endl;
    }
    cout<<endl;
}
////////////////////////////////////////////////////////////////////////////
#include "Test.h"

void main()
{
    Guess g;
    g.start();
}

/*
这是测试后的数据:
第一版的方法:
共进行100次测试:
   1次:    0         0%
   2次:    2         2%
   3次:    7         7%
   4次:   19        19%
   5次:   20        20%
   6次:   28        28%
   7次:   20        20%
   8次:    4         4%
   9次:    0         0%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%
五次内猜出: 48%
六次内猜出: 76%
七次内猜出: 96%

共进行1000次测试:
   1次:    0         0%
   2次:   15       1.5%
   3次:   59       5.9%
   4次:  156      15.6%
   5次:  231      23.1%
   6次:  311      31.1%
   7次:  165      16.5%
   8次:   54       5.4%
   9次:    3       0.3%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%
五次内猜出: 46.1%
六次内猜出: 77.2%
七次内猜出: 93.7%


共进行5000次测试:
   1次:    0         0%
   2次:   83      1.66%
   3次:  274      5.48%
   4次:  681     13.62%
   5次: 1184     23.68%
   6次: 1475      29.5%
   7次:  961     19.22%
   8次:  304      6.08%
   9次:   10       0.2%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 44.44%
六次内猜出: 73.94%
七次内猜出: 93.16%

第二版先取可能情况最多的猜的方法:
共进行100次测试:
   1次:    0         0%
   2次:    1         1%
   3次:    7         7%
   4次:    8         8%
   5次:   26        26%
   6次:   32        32%
   7次:   20        20%
   8次:    6         6%
   9次:    0         0%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 42%
六次内猜出: 74%
七次内猜出: 94%

共进行1000次测试:
   1次:    0         0%
   2次:   21       2.1%
   3次:   67       6.7%
   4次:  129      12.9%
   5次:  233      23.3%
   6次:  266      26.6%
   7次:  223      22.3%
   8次:   51       5.1%
   9次:    0         0%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 45%
六次内猜出: 71%
七次内猜出: 93.9%

共进行5000次测试:
   1次:    0         0%
   2次:   96      1.92%
   3次:  269      5.38%
   4次:  614     12.28%
   5次: 1005      20.1%
   6次: 1432     28.64%
   7次: 1253     25.06%
   8次:  310       6.2%
   9次:    0         0%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 39.68%
六次内猜出: 68.32%
七次内猜出: 93.38%

第二版先取可能情况最少的猜的方法:
共进行100次测试:
   1次:    0         0%
   2次:    2         2%
   3次:    6         6%
   4次:   11        11%
   5次:   20        20%
   6次:   28        28%
   7次:   23        23%
   8次:    9         9%
   9次:    1         1%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 39%
六次内猜出: 67%
七次内猜出: 90%

共进行1000次测试:
   1次:    0         0%
   2次:   15       1.5%
   3次:   49       4.9%
   4次:  111      11.1%
   5次:  256      25.6%
   6次:  290        29%
   7次:  184      18.4%
   8次:   71       7.1%
   9次:   18       1.8%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 43.1%
六次内猜出: 72.1%
七次内猜出: 90.5%

共进行5000次测试:
   1次:    0         0%
   2次:  105       2.1%
   3次:  301      6.02%
   4次:  667     13.34%
   5次: 1178     23.56%
   6次: 1409     28.18%
   7次:  839     16.78%
   8次:  358      7.16%
   9次:  114      2.28%
  10次:    0         0%
  11次:    0         0%
  12次:    0         0%
  13次:    0         0%
  14次:    0         0%
  15次:    0         0%

五次内猜出: 45.2%
六次内猜出: 73.38%
七次内猜出: 90.16%

*/

36 楼

#include<stdio.h>
#include<cstdlib>//为了用函数rand()
#include<ctime>//为了用函数time()
int a[4],b[4],H,l=1,k;
void suiji()
{
 int i,n;
 srand(time(0));//为rand()提供种子值
  for(i=0;i<4;i++)
   {
     a[i]=rand()%10; 
          for(n=0;n<i;n++)
          {
              if(a[i]==a[n])
              {
                a[i]=rand()%10;
                n=0;
              }
                    
          }
   }
  if(k)
  {
    printf("初始值\n");
    for(i=0;i<4;i++)
    {
      printf("%d ",a[i]);
    }
    printf("\n");k=0;
  }
}
void game(x1,x2,x3,x4)
 {
   int i,j,m=0,n=0;
   b[0]=x1;
   b[1]=x2;
   b[2]=x3;
   b[3]=x4;
   printf("第%d次\n",l);
   l=l+1;
   for(i=0;i<4;i++)
       if(b[i]==a[i]) n=n+1;
        H=n;
  printf("%dA",n);


 for(i=0;i<4;i++)
     for(j=0;j<4;j++)
          if(a[i]==b[j]) m=m+1;
          printf("%dB\n",m);
          printf("\n");
}

 main()
 {   char v;
     int c1,c2,c3,c4,x=1;  
    loop2:  printf("想在游戏中看到密码吗?输入1或0后回车即可\n");
            scanf("%d",&k);
            printf("请输入您所猜的数字,之间用空格隔开\n");
    loop1:  scanf("%d %d %d %d",&c1,&c2,&c3,&c4);
            if(c1==c2||c1==c3||c1==c4||c2==c3||c2==c4||c3==c4)
            {printf("输入的数字不能相同,请重新输入\n");
            goto loop1;
            }
      if(x) suiji();
      game(c1,c2,c3,c4);
      if(H!=4){H=0;x=0;goto loop1;} 
      else printf("恭喜您,答对了!!!\n想再来一盘吗?y/n输入后按回车\n\n");
      getchar();
      scanf("%c",&v);
      if(v=='y') {l=1;x=1;goto loop2; }
      else printf("谢谢您的使用!再见!!\n");
    

 }

37 楼

我写了个界面:
[url]http://www.programfan.com/club/showbbs.asp?id=175824[/url]
下载地址:[url] http://upload.programfan.com/upfile/200606181545248.rar[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册