I'm wondering what big oh this program is and if there is any way to optimize it.
It has a ton of for loops which function like an odometer to try the scoring method with different parameters. I dont suppose there is a way to just tell c# how many for loops to put and have it put in more or less following that pattern? Maybe recursion? I couldn't figure out how though. Thanks!!
It has a ton of for loops which function like an odometer to try the scoring method with different parameters. I dont suppose there is a way to just tell c# how many for loops to put and have it put in more or less following that pattern? Maybe recursion? I couldn't figure out how though. Thanks!!
Code:
class Program
{
static void Main(string[] args)
{
Optimize.timeStart = System.DateTime.Now.Ticks;
Optimize.optimize(4, 8);
}
}
public class Optimize {
public static long timeStart;
private static int[] solArr;
public static int optimize(int darts, int regions) {
if (darts <= 0 || regions <= 0)
throw new Exception();
if (darts == 1)
return regions;
if (regions == 1)
return darts;
solArr = new int[regions+1];
int tmax;
int max = 0;
solArr[1] = 1;
for (int i = 2; i <= 5; i ++) {
solArr[2] = i;
int jmax = findMax(darts, 2);
for (int j = i+1; j <= jmax; j++) {
solArr[3] = j;
int kmax = findMax(darts, 3);
for (int k = j+1; k <= kmax; k++) {
solArr[4] = k;
int lmax = findMax(darts, 4);
for (int l = k+1; l <= lmax; l++) {
solArr[5] = l;
int mmax = findMax(darts, 5);
for (int m = l+1; m <= mmax; m++) {
solArr[6] = m;
int nmax = findMax(darts, 6);
for (int n = m+1; n <= nmax; n++) {
solArr[7] = n;
int omax = findMax(darts, 7);
for (int o = n+1; o <= omax; o++) {
solArr[8] = o;
// for (int p = o+1; p <= findMax(darts, 8); p++) {
// solArr[9] = p;
tmax = findMax(darts, regions);
if (tmax >= max) {
max = tmax;
Console.Write(darts + ":");
for (int index = 1; index <solArr.Length - 1; index++)
Console.Write(solArr[index] + ", ");
Console.Write(solArr[solArr.Length - 1]);
Console.WriteLine("\nMax: " + max +"\tTime: " + (System.DateTime.Now.Ticks - timeStart)/10000 + " ms");
// }
}
}
}
}
}
}
}
}
return max;
}
private static int findMax(int darts, int regions) {
int[] permutations = new int[solArr[regions]*darts + 1];
for (int i = 0; i <= regions; i++) {
for (int j = 0; j <= regions; j++) {
for (int k = 0; k <= regions; k++) {
for (int l = 1; l <= regions; l++)
permutations[solArr[i] + solArr[j] + solArr[k] + solArr[l]] = 1;
}
}
}
for (int i = 5; i < permutations.Length; i++) {
if (permutations[i] == 0)
return i;
}
return permutations.Length;
}
}