算法:采用逐步缩小状态空间法,首先找出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;
}
}
}
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;
}
}
}