2017-01-31 31 views
-2

所以现在我正在为我的最后一篇文章编写一些代码,它需要你在system.in的一些输入中红色,处理它,第一行总是一个一组数字高达25个数字。接下来是一个N或L,另一个是目标。使用这个输入你必须找到正确的一组操作(+和*),它们使用int值来创建目标。布尔数组和一个简单的方法来尝试每个组合

我正在使用一个布尔数组来跟踪我在非常检查中使用的操作数,但是我不确定如何通过尝试每个不同的操作数来“强制”解决方案,我有代码来检查每个设置但是我不知道是否有一个简单和容易的方法来改变数组[0,0,0,0](0为false)到[0,0,0,1],[0,0, 1,0],[0,0,1,1]等?

我确定有一个非常简单的方法,我忽略了,但对于我的生活,我不确定它是什么atm。

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 << bitset或者我错了,我不确定,因为我从来没有和他们合作过 – 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来完成不同的组合。

相关问题