Topcoer-single round-MNS

import java.util.Vector;


public class MNS {
public static void main(String[] args) {
new MNS();
}


private Vector<String> rset = new Vector<String>();


public int ret = 0;


public MNS() {
// System.out.println((int) '0');
System.out.println(combos(new int[] { 1, 2, 3, 3, 2, 1, 2, 2, 2 }));
}


public int combos(int[] ns) {
numbers = ns;
Vector<Integer> used = new Vector<Integer>();
Vector<Integer> remain = new Vector<Integer>();
for (int i = 0; i < numbers.length; i++) {
remain.add(numbers[i]);
}
for (int i = remain.size() - 1; i >= 0; i--) {


int temp = remain.remove(0);
used.add(temp);
recurse(remain, used);
used.remove(used.size() - 1);
remain.add(temp);
}
// System.out.println(remain.toString());
// System.out.println(used.toString());
return ret;
}


private void recurse(Vector<Integer> remain, Vector<Integer> used) {
boolean satisfy = false;
switch (used.size()) {
case 1:
satisfy = true;
break;
case 2:
satisfy = true;
break;
case 3:
satisfy = true;
break;
case 4:
satisfy = true;
break;
case 5:
satisfy = true;
break;
case 6:
if (used.get(0) + used.get(1) + used.get(2) == used.get(3)
+ used.get(4) + used.get(5)) {
satisfy = true;
}
break;
case 7:
if (used.get(0) + used.get(1) + used.get(2) == used.get(3)
+ used.get(4) + used.get(5)
&& used.get(0) + used.get(1) + used.get(2) == used.get(0)
+ used.get(3) + used.get(6)) {
satisfy = true;
}
break;
case 8:
if (used.get(0) + used.get(1) + used.get(2) == used.get(3)
+ used.get(4) + used.get(5)
&& used.get(0) + used.get(1) + used.get(2) == used.get(0)
+ used.get(3) + used.get(6)
&& used.get(0) + used.get(1) + used.get(2) == used.get(1)
+ used.get(4) + used.get(7)) {
satisfy = true;
}
break;
case 9:
if (used.get(0) + used.get(1) + used.get(2) == used.get(3)
+ used.get(4) + used.get(5)
&& used.get(0) + used.get(1) + used.get(2) == used.get(6)
+ used.get(7) + used.get(8)
&& used.get(0) + used.get(1) + used.get(2) == used.get(0)
+ used.get(3) + used.get(6)
&& used.get(0) + used.get(1) + used.get(2) == used.get(1)
+ used.get(4) + used.get(7)
&& used.get(0) + used.get(1) + used.get(2) == used.get(2)
+ used.get(5) + used.get(8)) {
satisfy = true;
String string = "";
string = string + used.get(0) + "" + used.get(1) + ""
+ used.get(2) + "" + used.get(3) + "" + used.get(4)
+ "" + used.get(5) + "" + used.get(6) + ""
+ used.get(7) + "" + used.get(8) + "";
boolean dup = false;
for (int i = 0; i < rset.size(); i++) {
if (rset.get(i).equals(string)) {
dup = true;
break;
}
}
// System.out.println(used.toString());
// System.out.println(string);
if (!dup) {
// System.out.println("new");
rset.add(string);
ret++;
}
return;
}
break;
}
if (!satisfy) {
return;
}
for (int i = remain.size() - 1; i >= 0; i--) {
int temp = remain.remove(0);
used.add(temp);
recurse(remain, used);
used.remove(used.size() - 1);
remain.add(temp);
}
}


public int[] numbers;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值