算法:采用逐步缩小状态空间法,首先找出4个正确的数(位置不管),然后再确定其位置,对下一个测试的4个数字采用估价函数选取值最大的一个状态,这样状态空间缩小的很快,估价函数是该状态当未被排除时其参考的状态的 A的个数加B的个数,下面是全部程序,测试代码:(每一个CASE是随机产生的)
Cmain2 C = new Cmain2();
C.Search();
程序:(代码比较乱,思路不乱)
using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.Text;
using
System.Threading;

namespace
猜数字

...
{
public class CCase

...{
public int[] Case;
public int value;
public int A;
public int B;
}
public class myReverserClass : IComparer

...{
int IComparer.Compare(Object x, Object y)

...{
return ((new CaseInsensitiveComparer()).Compare(((CCase)y).value, ((CCase)x).value));
}
}
public class myReverserClass1 : IComparer

...{
int IComparer.Compare(Object x, Object y)

...{
return ((new CaseInsensitiveComparer()).Compare(((CCase)x).A, ((CCase)y).A));
}
}
public class Cmain2

...{
CCase CMyCase;
public CCase Answer;
ArrayList RightAr = new ArrayList();
ArrayList CaseAr = new ArrayList();
ArrayList ACase = new ArrayList();
public void Init()

...{
for (int i = 0; i < 10; i++)

...{
for (int j = i + 1; j < 10; j++)

...{
for (int k = j + 1; k < 10; k++)

...{
for (int l = k + 1; l < 10; l++)

...{
CCase MyCase = new CCase();

MyCase.Case = new int[4] ...{ i, j, k, l };
CaseAr.Add(MyCase);
}
}
}
}
CMyCase = (CCase)CaseAr[0];
CreateAnswer();
}
public Cmain2()

...{
Init();
}

/**//// <summary>
/// 搜索正确数字
/// </summary>
public void Search()

...{
Console.WriteLine("随机生成的 4 个数字: " + Answer.Case[0] + " " + Answer.Case[1] + " " + Answer.Case[2] + " " + Answer.Case[3] + " 下面开始模拟猜数字: ");
//Answer.Case=new int[4]{9,6,4,3};
while ((CMyCase.A + CMyCase.B != 4) && CaseAr.Count >1)

...{
//Thread.Sleep(1000);
CreateNextCase();
}
Console.WriteLine(" 已找到满意解,继续寻找最优解: ");
GetTheRightAnswer();
Console.WriteLine("找到了答案: " + CMyCase.Case[0] + " " + CMyCase.Case[1] + " " + CMyCase.Case[2] + " " + CMyCase.Case[3] + " ");
Console.WriteLine("共进行了 " + ACase.Count + " 次CASE");
}

/**//// <summary>
/// 产生下一用于测试的4数字
/// </summary>
public void CreateNextCase()

...{
ACase.Add(CMyCase);
CheckAnwser();
Console.WriteLine("CASE " + ACase.Count + ": " + CMyCase.Case[0] + " " + CMyCase.Case[1] + " " + CMyCase.Case[2] + " " + CMyCase.Case[3] + " 测试结果:" + CMyCase.A + "A" + CMyCase.B + "B");
CaseAr.Remove(CMyCase);
ClearCaseAr();
Console.WriteLine("剩下的状态空间数 :" + CaseAr.Count + " ");
if (CaseAr.Count <=1)

...{
if (CaseAr.Count==1)
CMyCase = (CCase)CaseAr[0];
return;
}
CMyCase = (CCase)CaseAr[0];

}

/**//// <summary>
/// 逐步缩小状态空间
/// </summary>
public void ClearCaseAr()

...{
int value = CMyCase.value;
for (int i = 0; i < CaseAr.Count; )

...{
int count = 0;
CCase ccase = ((CCase)CaseAr[i]);
for (int j = 0; j < 4; j++)

...{
for (int k = 0; k < 4; k++)

...{
if (CMyCase.Case[j] == ccase.Case[k])
count++;
}
}
if (count != value)

...{
CaseAr.RemoveAt(i);
}
else

...{
ccase.value = value;
i++;
}
}
myReverserClass cmp = new myReverserClass();
CaseAr.Sort(cmp);
}

/**//// <summary>
/// 随即产生要猜的CASE
/// </summary>
public void CreateAnswer()

...{
Answer = new CCase();

Answer.Case = new int[4] ...{ -1, -1, -1, -1 };
Random R = new Random();
int j = 0;
while (j < 4)

...{
bool AllowNumber = true;
int a = R.Next(10);
for (int i = 0; i < 4; i++)

...{
if (Answer.Case[i] == a)

...{
AllowNumber = false;
break;
}
}
if (AllowNumber)

...{
Answer.Case[j++] = a;
}
}

}

/**//// <summary>
/// 输入4个数字后检查状态为XAXB
/// </summary>
/// <returns></returns>
public bool CheckAnwser()

...{
int A = 0;
int B = 0;
for (int i = 0; i < 4; i++)

...{
if (CMyCase.Case[i] == Answer.Case[i])

...{
A++;
}
}
for (int i = 0; i < 4; i++)

...{
for (int j = 0; j < 4; j++)

...{
if (CMyCase.Case[j] == Answer.Case[i] && i != j)

...{
B++;
}
}
}
CMyCase.A = A;
CMyCase.B = B;
CMyCase.value = A + B;
if (A == 4)
return true;
else
return false;
}

/**//// <summary>
/// 当找到4个数字后(顺序好没定)确定4个数3的顺序
/// </summary>
public void GetTheRightAnswer()

...{
CCase TCMYCASE = new CCase();
TCMYCASE.Case = new int[4];
for (int i = 0; i < 4; i++)

...{
TCMYCASE.Case[i] = CMyCase.Case[i];
}
TCMYCASE.A = CMyCase.A;
TCMYCASE.B = CMyCase.B;
for (int i = 0; i < 4; i++)

...{
for (int j = 0; j < 4; j++)

...{
if (j == i)

...{
continue;
}
for (int k = 0; k < 4; k++)

...{
if (i == k || k == j)

...{
continue;
}
CCase cCase = new CCase();

cCase.Case = new int[4] ...{ TCMYCASE.Case[i], TCMYCASE.Case[j], TCMYCASE.Case[k], TCMYCASE.Case[6 - i - k - j] };
if (IsGood(cCase))

...{
CMyCase = cCase;
bool IsA = CheckAnwser();
Console.WriteLine("CASE: " + CMyCase.Case[0] + " " + CMyCase.Case[1] + " " + CMyCase.Case[2] + " " + CMyCase.Case[3] + " 测试结果:" + CMyCase.A + "A" + CMyCase.B + "B ");
ACase.Add(CMyCase);
if (IsA)

...{
return;
}
}
}
}
}
}

/**//// <summary>
/// 对当前的解看是否满足以前尝试的数字
/// </summary>
/// <param name="cCase"></param>
/// <returns></returns>
public bool IsGood(CCase cCase)

...{
bool isGood = true;
foreach (CCase TcCase in ACase)

...{
int A = 0;
for(int i=0;i<4;i++)

...{
if (TcCase.Case[i] == cCase.Case[i])
A++;
}
if (A != TcCase.A)

...{
isGood = false;
break;
}
}
return isGood;
}
}
}