世界杯开始了!买个足彩是必须的的,在网上看到一个14场胜负彩玩法,感觉挺有意思,突发奇想我自己能不能写一个呢?于是花了几个小时的时间,写了出来感觉挺有成就感的。现在将算法拿出来分享给大家。
玩法如下:
由购买者从中国足球彩票胜负玩法选择的所有竞猜场次每场比赛在全场90分钟(含伤情补时)比赛的胜平负的结果进行投注,对于所选竞猜场次的比赛成绩均只选择1种预测结果为单式投注,对于某一竞猜场次的比赛成绩选择2种(含)以上的预测结果为复式投注。
购买者可对其选定的结果进行多倍投注,投注倍数范围为2-99倍。现在一期胜负彩数量总共为14场。每注2元人民币。
解题过程
- 必须每场都要预测 选中14场才算1注。
题目分析 如下图(1-2)所示, 1 2 3 6 9 18 27 54 ………… 等等。(其实这样分析是错误的,我们不能简单的用数学归纳法进行总结,在这里我坠入了一个坑,想用数学公式来解决这个问题)。
图(1-2)a
图(1-2)b2为死胡同,于是我重新梳理思路,发现其实数据结构并不复杂,将其转化为二维数组,将胜负平等基本信息忽略,只关注“选中”和“不选”中两种情况。例如图(1-3)0标识未选中 1标识选中
图(1-3)- 遇到“选中”标识后下钻,寻找到后继续下钻碰到选中标识后继续…. 这个不就是递归吗? (灵感来了)
- 经过两个小时奋战后,将代码搞出来啦。
public class Demo {
public static void main(String[] args) {
Integer[][] temps = new Integer[][]
{
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0},
{1,0,0}
};
Integer[][] nt = new Integer[temps.length][2];
List<Integer[]> newList = new ArrayList<Integer[]>();
for (int i = 0; i < temps.length; i++) {
//这个排序很重要,不排序则碰到0就停止递归了,我们必须要保证第一个位置要转化例如
// 0 0 1 要转化为 1 0 0 才可以。其实这个转化是等价的 ,包括 0 1 0 和 1 0 0 也是等价的。
Arrays.sort(temps[i],new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Integer e1 =Integer.valueOf(o1.toString());
Integer e2 =Integer.valueOf(o2.toString());
if (e1<e2) {
return 1;
}else if(e1>e2){
return -1;
}
return 0;
}
});
nt[i] = temps[i];
}
for (int i = 0; i < 2; i++) { //找到第一行,开始下钻,完成一轮递归后
//在横向寻址后继续下钻。
find(0,i,nt);
}
System.out.println("总数:"+sum);
}
static int sum = 0; //统计总数
private static void find(int i, int a, Integer[][] nt) {
System.out.println("i="+i+":a="+a+":data="+nt[i][a]);
if (1==(nt[i][a])) { //判断如果为1则下钻
if (i<14) {//没碰到最后一位则继续纵向下钻
find(i+1, 0, nt);
}else{
System.out.println(++sum);//必须下钻到最后一个才会统计
}
if (a<2) { //横向寻址
find(i,a+1,nt);
}
}
}
}
解释一下,所用的名词:
纵向下钻 和 横向寻址
好啦!祝大家世界杯快乐。