如何在不使其多线程的情况下更快地实现这一目标?

时间:2016-12-04 21:25:37

标签: java performance

我的程序在输出方面工作正常,但对于我的一些测试用例,找到答案需要太长时间(有时需要18秒)。我想知道如何提高代码的性能。

我的代码做了什么: 这是对Pebble Solitaire的看法。用户输入n个游戏,然后输入长度为23的字符串,其中仅包含“' o”的组合。 (鹅卵石)和' - ' (空的空间)。如果有两个相邻的鹅卵石,两边都是空的空间,即(oo-OR -oo),那么你去掉中间的鹅卵石,然后将另外两块相互交换,ex​​' oo - '将变成' - o'。

我目前的方法几乎是一种详尽的方法,它会尝试每一个可能的移动,并在移动设置时留下最少数量的鹅卵石。

我想知道如何在不使其成为多线程的情况下改进此解决方案。

这就是我所拥有的:

package Pebble;

import java.util.Scanner;

public class PebbleSolitaire {

    public static void main(String[] args){

        Scanner input = new Scanner(System.in);
        int numOfGames = Integer.parseInt(input.nextLine());

        while (numOfGames > 0){

            char[] values = input.nextLine().toCharArray();
            long startTime = System.nanoTime();
            System.out.println(solve(values));
            System.out.println("Time to finish in ms: " + (System.nanoTime() - startTime) / 1000000);
            numOfGames--;
        }
        input.close();
    }

    private static int solve(char[] game){

        if(game != null && game.length == 0){
            return -1;
        }

        int result = 0;

        for (int i = 0; i < game.length; i++){
            if(game[i] == 'o'){
                result++;
            }
        }

        //print(game);

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

            char[] temp = new char[game.length];
            copyArray(temp, game);

            if (i-2 >= 0 && temp[i] == '-' && temp[i-2] == 'o' && temp[i-1] == 'o'){//move pebble forwards
                temp[i-1] = temp[i-2] = '-'; 
                temp[i] = 'o';
                result = Math.min(result, solve(temp));
            }

            copyArray(temp, game);

            if(i+2 < temp.length && temp[i] == '-' && temp[i+1] == 'o' && temp[i+2] == 'o'){//move pebble backwards
                temp[i+1] = temp[i+2] = '-';
                temp[i] = 'o';
                result = Math.min(result, solve(temp));
            }
        }
        return result;
    }

    private static void copyArray(char[] copy, char[] og){
        for(int x = 0; x < copy.length; x++){
            copy[x] = og[x];
        }
    }
    private static void print(char[] c){
        for(char ch: c){
            System.out.print(ch);
        }
        System.out.println();
    }
}

我的示例输入和输出:

2
-o----ooo----o----ooo--
6
Time to finish in ms: 0
oooooooooo-ooooooooooo-
4
Time to finish in ms: 18149

编辑:完全迭代会大幅改善性能吗?

0 个答案:

没有答案