算法基本分2部分
先筛选出前2个数字,判断他们的位置,后不参加后面的判断,直到四个数字位置全对
在筛选出后2个数字,判断他们的位置
最终结果存放在一个数组中S[]中
首先从0000,1111,2222….开始for循环到9999
依次判断人输入的猜对的个数M,知道有数字猜对会有5种情况,依次为
M=0:进行下次循环
M=1:得知此时四个数中的一位,设为N1,N1位置设为LN1=1;开始判断这个数的位置,同时判断其他未知数,电脑开始改变输出数字规则,按照此时知道的数字和猜它相应的位置,同时输入此数字+1的值判断猜对个数M和位置L来输出数字让人猜,M=1则排出N1+1不在四个数中,M=2则说明N1+1为四个数中之一,开始判断这两个数的位置,确定位置后这两个数将不参加后面数字判断,后面两个数字判断和位置确定跟前两个位置判断过程一样
M=2:说明这两个数相同存在,但位置不确定,调用上面的函数利用不存在四个树种的数根据提示位置的多少骗出两个相同数的位置,确定位置后这两个数将不参加后面数字判断,后面两个数字判断和位置确定跟前两个位置判断过程一样
M=3:说明三个数相同存在,利用一个不存在四个数中的数确定出三个数的位置,然后最后确定最后一个数
M=4:直接猜出来了。
欺骗的情况为for循环结束
不会超过18步
例子:人猜数字为5326
0000
0 0
1111
0 0
2222
1 1
2333
2 1(n1=2,n2=3,位置不确定,开始分两个方向正常判断位置和mapping2的位置,此情况为开始mapping2的位置)
3200(借助2个不存在四个树中数字来判断出n1,n2位置)
2 0
0320
2 2(mapping结束标示,得出n1,n2的位置,开始判断下面的数字,判断出位置的不参加下面的判断,下面的判断过程和上面一样确定2个数字相应的位置)
4444
0 0
5555
1 1
5666
2 2
5326
3 4
成功