我的程序在输出方面工作正常,但对于我的一些测试用例,找到答案需要太长时间(有时需要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
编辑:完全迭代会大幅改善性能吗?