2017-01-31 1 views
-2

私は最後のcomp sci紙のコードを書いている瞬間、system.inの入力を赤くする必要があります。最初の行は常に25までの数字の集合。これには、単一のNまたはLと、目的となる別のintが続きます。この入力を使用すると、int値を使用して目的を作成する正しい操作セット(+と*)を見つける必要があります。ブール配列とすべての組み合わせを試す簡単な方法

私はブール配列を使用して、私が非常にチェックしているオペランドを追跡していますが、私はどのようにオペランドのすべての異なるセットを試みることによって解決策を "ブルートフォース"するのかは分かりません。しかし、[0,0,0,0](0は偽)から[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をインクリメントして、さまざまな組み合わせを進めることができます。

関連する問題