2017-01-31 5 views
-2

Итак, в настоящий момент я пишу код для своей последней комп. Sci-бумаги, это требует, чтобы вы краснели на некотором входе на system.in, обрабатываете его, первая строка всегда набор чисел до 25 номеров. За этим следует одиночный N или L, а другой int - цель. Используя этот вход, вы должны найти правильный набор операций (+ и *), который использует значения int для создания цели.Булевы массивы и простой способ попробовать каждую комбинацию

Я использую логический массив, чтобы отслеживать, какие операнды я использую в очень проверке, однако я не уверен, как «переборщить» решение, пробовав каждый другой набор операндов, у меня есть код для проверки каждого но не уверен, что есть простой и простой способ изменить массив, например [0,0,0,0] (0 - false) до [0,0,0,1], [0,0, 1,0], [0,0,1,1] и т. Д.?

Я уверен, что есть действительно простой способ, которым я упускал из виду, но для жизни меня я не уверен, что это такое.

static boolean evlN(int[] input, boolean[]ops, int aim){ 
    boolean run = true, found = false; 
    int[] used = new int[input.length]; 
    int runs = 0 ,ans = 0; 
    while(!found && runs < (1 << ops.length)){ 
     //finding all multiplys and doing them first 
     search: 
     for(int x = 0; x < ops.length; x++){ 
      if(!ops[x]){ 
       used[x] = input[x] * input[x+1]; 
       //need to stop working out and change the ops 
       if(used[x] > aim){ 
        run = false; 
        break; 
       } 
      } 
     } 
     //once multiplys have been done need to do all the adds 
     if(run){ 
      for(int x = 0; x < ops.length; x++){ 
       if(ops[x]){ 
        if(used[x] != 0) ans += used[x] + input[x+1]; 
        else if(used[x+1] != 0) ans += input[x] + used[x]; 
       } 
       if(ans > aim) break; 
      } 
     } 
     if(ans == aim) found = true; 
     used = new int[input.length]; 
     ans= 0; 
     runs++; 
     run = !run; 
    } 
    if(found) return true; 
    else return false; 

} 

это то, что им с помощью отработать каждый набор операндов и номер я просто пытаюсь изменить булев массив грубой силы ответа

+1

'У меня есть код для проверки каждого набора' ... вы можете показать нам этот код? –

+0

Вы можете использовать бит-набор вместо булевого массива и просто увеличивать его. – shmosel

+0

@shmosel, как вы используете бит набор? я знаю, что вы можете сделать 1 << битс или я ошибаюсь, я не уверен, потому что я никогда с ними не работал до – NexMetu

ответ

0

Существует довольно общий механизм, который может использоваться для увеличения через комбинацию, как и для цифр в целых числах. Я продемонстрирую его с помощью интерфейса, чтобы вы могли видеть, как его можно применять в целом.

public interface UnitValue { 
    boolean isLast(); 
    UnitValue next(); 
} 

public class <T extends UnitValue> MultiUnitValue { 
    private final int size; 
    private final T first; 
    private final T[] units; 
    private boolean complete = false; 

    public MultiUnitValue(int size, T first) { 
     this.size = size; 
     this.first = first; 
     this.units = new T[size]; 
     for (int i = 0; i < size; i++) 
      units[i] = first; 
    } 

    public void next() { 
     if (!complete) { 
      int i = 0; 
      while (units[i].isLast()) 
       units[i++] = first; 
      units[i].next(); 
      complete = i == size - 1 && units[i].isLast(); 
     } 
    } 
} 

Я потерял геттеры для ясности, но они должны быть очевидными.

Для необщего решения для булевых было бы выглядеть так:

boolean[] values = new boolean[size]; 

int i = 0; 
while (values[i]) 
    values[i++] = false; 
values[i] = true; 

Очень похожее решение работает для символов, цифр, перечислений и всего остального, что соответствует той же схеме.

+0

ДА, это то, что я искал, спасибо. Мой мозг - месиво, и я знал, что это что-то вроде этого, но спасибо за ответ, который спас меня, проведя еще один день на этой задаче. – NexMetu

0

Вашего набор входных комбинаций выглядит как двоичное целое число (вызова это N). Вы можете продвигаться через различные комбинации, увеличивая N.

 Смежные вопросы

  • Нет связанных вопросов^_^