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;
}
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;
}