//这个类的作用是把数组进行排列class Combination
{
static int[][] result;
static int d=0;
static int w=0; public static int[][] getCombination(int[] a){
return getCombination(a,a.length);
}
public static int[][] getCombination(int[] a,int n){
result=new int[getCombNum(a.length,n)][n];
combination(a,n);
return result;
}
static void combination(int[] a,int n){
int[] m;
for(int i=0;i<a.length;i++){
for(int j=0;j<getCombNum(a.length-1,n-1);j++){
result[d+j][w]=a[i];
}
m=remove(a,a[i]);
if(n==2){
for(int t=0;t<m.length;t++){
result[d++][w+1]=m[t];
}
}else{
w++;
combination(m,n-1);
w--;
}
}
}
public static int factorial(int i){
int n=1;
for(;i>0;i--){
n*=i;
}
return n;
}
static int getCombNum(int len,int num){
if(len==num)
return factorial(len);
return factorial(len)/factorial(len-num);
}
static int[] remove(int[] a,int b){
int[] r=new int[a.length-1];
int n=0;
boolean flag=true;
for(int i=0;i<a.length;i++){
if(a[i]==b && flag){
flag=false;
continue;
}
r[n++]=a[i];
}
return r;
}
};
{
static int[][] result;
static int d=0;
static int w=0; public static int[][] getCombination(int[] a){
return getCombination(a,a.length);
}
public static int[][] getCombination(int[] a,int n){
result=new int[getCombNum(a.length,n)][n];
combination(a,n);
return result;
}
static void combination(int[] a,int n){
int[] m;
for(int i=0;i<a.length;i++){
for(int j=0;j<getCombNum(a.length-1,n-1);j++){
result[d+j][w]=a[i];
}
m=remove(a,a[i]);
if(n==2){
for(int t=0;t<m.length;t++){
result[d++][w+1]=m[t];
}
}else{
w++;
combination(m,n-1);
w--;
}
}
}
public static int factorial(int i){
int n=1;
for(;i>0;i--){
n*=i;
}
return n;
}
static int getCombNum(int len,int num){
if(len==num)
return factorial(len);
return factorial(len)/factorial(len-num);
}
static int[] remove(int[] a,int b){
int[] r=new int[a.length-1];
int n=0;
boolean flag=true;
for(int i=0;i<a.length;i++){
if(a[i]==b && flag){
flag=false;
continue;
}
r[n++]=a[i];
}
return r;
}
};
解决方案 »
- 关于数据的过滤(版本及状态)
- java 相关
- 跪求大侠告知,java控件JTextArea怎么能实现想DOS命令行一样的永远存在焦点的效果!
- 抛出:Exception in thread "main" java.lang.ClassCastException: User cannot be cast to [Ljava.lang.Object;是什么原因啊?
- [问题]一个简单Socket编程的问题
- 能否统一设置界面上的字体
- object对象转换的问题
- serverlet中,怎样输出汉字到httprequest(就是用户的页面)中去呀?我的怎么全是乱码呀?
- jsp调用real进行连续播放中的问题,请大虾们帮忙解决啊!在线等待!!
- 急急急!!!
- 关于线程池的问题
- Java能否做到把取得的有格式文字转化成流,再把这个流转化成有格式文字?如果可以,应该怎么做?
public static String read (String prompt) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print(prompt);
System.out.flush();
String reply = in.readLine();
return reply;
} catch (IOException e) {return "";}
}
}
我也不用写给你开眼,我就告诉你怎么做好了。4个操作数填4个位置,4个运算符填3个位置,用穷举法生成所有形如“3+2*8-9”的表达式,然后直接在Python里运行表达式。这样一个程序你要是也能写出100行,算你有本事,行了吧?
但是一定要考虑小数运算及其造成的误差.
楼上说的用Python的多少行的,也不想想可以这么说:如果别人写了一个库专门算24点,那岂不是最多只要用一条语句就完成了计算24点?
下面给出我的实现:package test;import java.awt.*;
import java.awt.event.*;import java.math.*;import java.util.Vector;import javax.swing.*;
/**
*
24点计算程序
*
copyright:wolfsquare copyright (c) 2002
* 许可:
* 如果转载请注明出处,禁止将本代码用于商业用途.
* 改进或建议可与[email protected]联系
* @author wolfsquare
* @version 1.0
*/
public class point24 extends JFrame implements Runnable {
private final static double precision = 0.1; // 允许和24的最小的差值精度
private static final String[] fontsettings = {
"checkbox.font", "tree.font", "viewport.font", "progressbar.font",
"radiobuttonmenuitem.font", "toolbar.font", "colorchooser.font",
"togglebutton.font", "panel.font", "textarea.font", "menu.font",
"tableheader.font", "textfield.font", "optionpane.font", "menubar.font",
"button.font", "label.font", "passwordfield.font", "scrollpane.font",
"menuitem.font", "tooltip.font", "list.font", "editorpane.font",
"table.font", "tabbedpane.font", "radiobutton.font", "checkboxmenuitem.font",
"textpane.font", "popupmenu.font", "titledborder.font",
"internalframe.titlefont", "combobox.font",
};
Vector listdata = new Vector();
boolean stopflag = false;
JPanel JPanel2 = new JPanel();
JButton jbtnstart = new JButton();
JButton jbtnstop = new JButton(); Thread Thread = new Thread(this);
String[] op = { "+", "-", "*", "/" };
String[][] ops = null;
int[] allnum;
private JPanel JPanel4 = new JPanel();
private BorderLayout BorderLayout1 = new BorderLayout();
private JPanel JPanel1 = new JPanel();
private JList JList1 = new JList(listdata);
private JLabel JLabel = new JLabel("结果:");
private JTextField jtxtopnum1 = new JTextField();
private JTextField jtxtopnum2 = new JTextField();
private JTextField jtxtopnum3 = new JTextField();
private JTextField jtxtopnum4 = new JTextField();
private JScrollPane JScrollPane1 = new JScrollPane();
private JSplitPane JSplitPane1 = new JSplitPane();
private BorderLayout BorderLayout2 = new BorderLayout();
private JProgressBar JProgressBar1 = new JProgressBar();
private GridLayout GridLayout1 = new GridLayout(6, 1);
private JButton jbtncalculatesingle = new JButton();
private JPanel JPanel3 = new JPanel();
private JLabel jlblmessage = new JLabel(); public point24() {
try {
jbinit();
} catch (Exception e) {
e.printStackTrace();
} initdata();
} public static void setfont() {
Font defaultfont = new Font("宋体", Font.PLAIN, 12); for (int i = 0; i < fontsettings.length; i++) {
UIManager.put(fontsettings[i], defaultfont);
}
} public static void main(String[] args) {
point24 frame2 = new point24();
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.show();
} private void jbinit() throws Exception {
setfont();
this.setSize(new Dimension(400, 300));
jbtnstart.setText("start");
jbtnstart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jbtnstart_actionPerformed(e);
}
});
jbtnstop.setText("stop");
jbtnstop.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jbtnstop_actionPerformed(e);
}
});
JPanel4.setLayout(BorderLayout1);
JPanel1.setLayout(BorderLayout2);
jbtncalculatesingle.setText("计算");
jbtncalculatesingle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jbtncalculatesingle_actionPerformed(e);
}
});
JPanel3.setLayout(GridLayout1);
jlblmessage.setText("状态");
JPanel2.setBorder(BorderFactory.createEtchedBorder());
this.getContentPane().add(JPanel2, BorderLayout.SOUTH);
JPanel2.add(jbtnstart, null);
JPanel2.add(jbtnstop, null);
this.getContentPane().add(JPanel4, BorderLayout.CENTER);
JPanel4.add(JSplitPane1, BorderLayout.CENTER);
JPanel1.add(JProgressBar1, BorderLayout.SOUTH);
JPanel1.add(JScrollPane1, BorderLayout.CENTER);
JSplitPane1.add(JPanel3, JSplitPane.TOP);
JScrollPane1.getViewport().add(JList1, null);
JSplitPane1.add(JPanel1, JSplitPane.BOTTOM);
JPanel3.add(JLabel, null);
JPanel3.add(jtxtopnum1, null);
JPanel3.add(jtxtopnum2, null);
JPanel3.add(jtxtopnum3, null);
JPanel3.add(jtxtopnum4, null);
JPanel3.add(jbtncalculatesingle, null);
JPanel4.add(jlblmessage, BorderLayout.SOUTH);
JSplitPane1.setDividerLocation(200);
this.setTitle("24点计算");
} void jbtnstart_actionPerformed(ActionEvent e) {
Thread.start();
} private void initdata() {
allnum = new int[13]; // 产生1-13数字
for (int i = 0, n = 1; i < 13; i++, n++) {
allnum[i] = n;
} for (int i = 0; i < 13; i++)
System.out.print(" " + allnum[i]); // 运算符全排列
ops = new String[64][3]; for (int i = 0, n = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
for (int k = 0; k < 4; k++, n++) {
ops[n][0] = op[i];
ops[n][1] = op[j];
ops[n][2] = op[k];
}
}// (未完)第一部分
// 执行单次运算
public double caculate(int num1, String op1, int num2, String op2, int num3,
String op3, int num4) {
double ret = 0; ret = caltwo(num1, op1, num2);
ret = caltwo(ret, op2, num3);
ret = caltwo(ret, op3, num4); return ret;
} /**
* 两元计算
* @param num1
* @param op
* @param num2
* @return
*/
private double caltwo(double num1, String op, double num2) {
double ret = 0; if (op.equals("+")) {
ret = num1 + num2;
} else if (op.equals("-")) {
ret = num1 - num2;
} else if (op.equals("*")) {
ret = num1 * num2;
} else {
ret = num1 / num2;
} return ret;
} public void run() {
System.out.println("run");
this.jbtnstart.setEnabled(false); int pos1 = 0;
int pos2 = 1;
int pos3 = 2;
int pos4 = 3;
double val = 0;
StringBuffer strb = new StringBuffer();
JProgressBar1.setMinimum(0);
JProgressBar1.setMaximum(13 * 13 * 13 * 13); int step = 0; if (listdata.size() > 0) {
listdata.removeAllElements();
} int size = 0; // 穷举法
for (pos1 = 0; (pos1 < 13) && !stopflag; pos1++)
for (pos2 = 0; (pos2 < 13) && !stopflag; pos2++)
for (pos3 = 0; (pos3 < 13) && !stopflag; pos3++)
for (pos4 = 0; (pos4 < 13) && !stopflag; pos4++) {
for (int i = 0; (i < 64) && !stopflag; i++) { // 四则运算全排列遍历
val = caculate(allnum[pos1], ops[i][0], allnum[pos2], ops[i][1],
allnum[pos3], ops[i][2], allnum[pos4]); if (Math.abs(Math.abs(val) - 24) < precision) { // 绝对差超过最小精度的不算是整除
strb = new StringBuffer();
strb.append(String.valueOf(allnum[pos1]));
strb.append(ops[i][0]);
strb.append(String.valueOf(allnum[pos2]));
strb.append(ops[i][1]);
strb.append(String.valueOf(allnum[pos3]));
strb.append(ops[i][2]);
strb.append(String.valueOf(allnum[pos4]));
listdata.addElement(strb.toString()); if ((step % 100) == 0) {
JList1.setListData(listdata);
JList1.repaint();
} // System.out.println(strb.toString() );
size++;
strb = new StringBuffer();
strb.append("当前进度:");
strb.append(String.valueOf(step + 1));
strb.append(" 符合个数:");
strb.append(size);
jlblmessage.setText(strb.toString()); break;
}
} JProgressBar1.setValue(step++);
jlblmessage.repaint();
} JList1.setListData(listdata);
JList1.repaint();
System.out.println("end");
this.jbtnstart.setEnabled(true);
} public void stop() {
stopflag = !stopflag;
} void jbtnstop_actionPerformed(ActionEvent e) {
stop();
} void jbtncalculatesingle_actionPerformed(ActionEvent e) {
jbtncalculatesingle.setEnabled(false); boolean ret = false;
double val = 0;
StringBuffer strb = null;
int[] num = { 0, 0, 0, 0 }; try {
num[0] = Integer.parseInt(jtxtopnum4.getText());
num[1] = Integer.parseInt(jtxtopnum3.getText());
num[2] = Integer.parseInt(jtxtopnum2.getText());
num[3] = Integer.parseInt(jtxtopnum1.getText());
} catch (Exception ex) {
} int[][] n = new int[24][4];
int count = 0; for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
if (i == j) {
continue;
} for (int k = 0; (i != j) && (k < 4); k++) {
if ((k == i) || (k == j)) {
continue;
} for (int l = 0; l < 4; l++) {
if ((l == i) || (l == j) || (l == k)) {
continue;
} n[count][0] = num[i];
n[count][1] = num[j];
n[count][2] = num[k];
n[count++][3] = num[l];
}
}
} System.out.println("组合数:" + count); listdata.removeAllElements();
JList1.repaint(); for (count--; (count >= 0) && !ret; count--)
for (int i = 0; (i < 64) && !ret; i++) {
val = caculate(n[count][0], ops[i][0], n[count][1], ops[i][1],
n[count][2], ops[i][2], n[count][3]); strb = new StringBuffer();
strb.append(String.valueOf(n[count][0]));
strb.append(ops[i][0]);
strb.append(String.valueOf(n[count][1]));
strb.append(ops[i][1]);
strb.append(String.valueOf(n[count][2]));
strb.append(ops[i][2]);
strb.append(String.valueOf(n[count][3]));
listdata.addElement(strb.toString()); if (Math.abs(Math.abs(val) - 24) < precision) {
JLabel.setText(strb.toString());
ret = true;
}
} JList1.repaint(); if (!ret) {
JLabel.setText(" 结果: 计算不出 " + val);
} jbtncalculatesingle.setEnabled(true);
}
}
import java.util.*;//这个类是进行穷举计算生成结果集的
public class Cal24 {
private Set sourceSet = new HashSet();
private boolean success = false;
Cal24(String[] s) {
sourceSet=new input().rearrange(new MyArray(s));
}
private double calValue(double op1, double op2, int operator)
{
switch(operator) {
case 0 : return op1 + op2;
case 1 : return op1 - op2;
case 2 : return op1 * op2;
case 3 : return op1 / op2;
case 4 : return op2 - op1;
case 5 : return op2 / op1;
default: System.out.println("Error!");
return 0;
}
}
public HashSet work(MyArray a) {
double value1,value2,result;
HashSet resultSet = new HashSet();
//boolean success = false;
for (int i=0; i<6; i++) {
value1 = calValue(a.getElement(0),a.getElement(1),i);
for (int j=0; j<6; j++) {
value2 = calValue(value1,a.getElement(2),j);
for (int k=0; k<6; k++) {
result =calValue(value2,a.getElement(3),k);
if (result<=24.02 && result>=23.98) {
if (!success) success = true;
//load the result into a string array
//turn every number in result into string
String c[] = new String[8];
c[0] = Integer.toString((int)a.getElement(0));
c[1] = Integer.toString(i);
c[2] = Integer.toString((int)a.getElement(1));
c[3] = Integer.toString(j);
c[4] = Integer.toString((int)a.getElement(2));
c[5] = Integer.toString(k);
c[6] = Integer.toString((int)a.getElement(3));
c[7] = "A";
resultSet.add(c);
}
}
}
}
for (int i=0; i<6; i++) {
value1 = calValue(a.getElement(0),a.getElement(1),i);
for (int j=0; j<6; j++) {
value2 = calValue(a.getElement(2),a.getElement(3),j);
for (int k=0; k<6; k++) {
result =calValue(value1,value2,k);
if (result<=24.02 && result>=23.98) {
if (!success) success = true;
//load the result into a string array
//turn every number in result into string
String c[] = new String[8];
c[0] = Integer.toString((int)a.getElement(0));
c[1] = Integer.toString(i);
c[2] = Integer.toString((int)a.getElement(1));
c[3] = Integer.toString(k);
c[4] = Integer.toString((int)a.getElement(2));
c[5] = Integer.toString(j);
c[6] = Integer.toString((int)a.getElement(3));
c[7] = "B";
resultSet.add(c);
}
}
}
}
//if(!success) System.out.println("Calculation failed!");
return resultSet;
}
public HashSet work() {
HashSet permanentSet=new HashSet();
Iterator it = sourceSet.iterator();
while(it.hasNext())
permanentSet.addAll(work((MyArray)it.next()));
return permanentSet;
}
public boolean success() {return success;}
public static void main(String[] args) {
//Set sourceSet = HashSet();
//sourceSet = new input().rearrange(args)
Cal24 cal24 = new Cal24(args);
HashSet s = cal24.work();
if(cal24.success()) {
Output o = new Output();
o.resultTree(s);
o.prtResult();
}
}
}
class MyArray {
private double[] sourceData = new double[4];
MyArray(String[] source) {
for(int i=0; i<source.length; i++)
sourceData[i] = (double)Integer.parseInt(source[i]);
}
MyArray() {}
MyArray(MyArray a){
for (int i=0; i<a.getLength(); i++)
this.sourceData[i]=a.sourceData[i];
}
public int hashCode() {
return (int)(sourceData[0]*1000+sourceData[1]*100+sourceData[2]*10+sourceData[3]);
}
public void add(double d, int index) {
sourceData[index] = d;
}
public double get(int i) {
double d = sourceData[i];
int j = i+1;
for(; j<getLength(); j++)
sourceData[j-1] = sourceData[j];
sourceData[j-1]=0;
return d;
}
public double getElement(int i) {
return sourceData[i];
}
public int getLength() {
int j = 0;
for(int i=0; i<sourceData.length; i++)
if(sourceData[i]!=0) j++;
return j;
}
public boolean equals(Object o) {
return(o instanceof MyArray)&&(hashCode()==((MyArray)o).hashCode());
}
public String toString() {
String s = "{";
for(int i=0; i<getLength(); i++)
s+=(int)getElement(i)+",";
s+="}";
return s;
}
}
class input {
private Set inputSet = new HashSet();
public Set rearrange (MyArray a) {
MyArray getArray = new MyArray();
MyArray[] bufferArray = new MyArray[4];
for(int i=0; i<a.getLength(); i++) {
bufferArray[0] = new MyArray(a);
getArray.add(a.get(i),0);
for(int j=0; j<a.getLength(); j++) {
bufferArray[1] = new MyArray(a);
getArray.add(a.get(j),1);
for(int k=0; k<a.getLength(); k++) {
bufferArray[2] = new MyArray(a);
getArray.add(a.get(k),2);
for(int p=0; p<a.getLength();p++) {
bufferArray[3] = new MyArray(a);
getArray.add(a.get(p),3);
//System.out.println(getArray);
inputSet.add(new MyArray(getArray));
a = new MyArray(bufferArray[3]);
}
a = new MyArray(bufferArray[2]);
}
a = new MyArray(bufferArray[1]);
}
a = new MyArray(bufferArray[0]);
}
return inputSet;
}
}
import java.util.*;
//下面这一段是解析上面生成的每一个合法结果,在合理的位置加上括号,并运用交换率去掉
//一些明显的相似解。
class BinNode {
private String opx;
private BinNode left;
private BinNode right;
public BinNode() {}
public BinNode(String op) {
opx = op; left = null; right = null; }
public BinNode(String op, BinNode l, BinNode r) {
opx=op; left = l; right = r; }
public BinNode(String op, String l, String r) {
opx = op;
left = new BinNode(l);
right = new BinNode(r);
}
public String element() { return opx;}
public String setElement(String v) {return opx = v;}
public BinNode left() { return left;}
public BinNode setLeft(BinNode p) {return left = p;}
public BinNode setLeft(String v) {return left = new BinNode(v);}
public BinNode right() {return right;}
public BinNode setRight(BinNode p) { return right = p; }
public BinNode setRight(String v) { return right = new BinNode(v);}
public boolean isLeaf() { return (left==null&&right==null);}
public boolean equals(Object o) {
boolean b=false;
if(o instanceof BinNode) {
BinNode t=(BinNode)o;
if(t.element()==element()) {
if(t.isLeaf()&&this.isLeaf()) b=true;
else {
b=t.left().equals(this.left())&&t.right().equals(this.right());
if(!b&&(element()=="+"||element()=="*"))
b=t.left().equals(this.right())&&t.right().equals(this.left());
}
}
}
return b;
}
public int hashCode() {
return 1;
}
}
class CTree {
private static BinNode createNode(String i, BinNode l, BinNode r) {
BinNode bn = new BinNode();
switch (Integer.parseInt(i)) {
case(0): bn=new BinNode("+",l,r); break;
case(1): bn=new BinNode("-",l,r); break;
case(2): bn=new BinNode("*",l,r); break;
case(3): bn=new BinNode("/",l,r); break;
case(4): bn=new BinNode("-",r,l); break;
case(5): bn=new BinNode("/",r,l); break;
default: bn=null;
}
return bn;
}
public static BinNode createTree(String[] a, int i) {
BinNode bn = new BinNode();
if(a[a.length-1]=="A") {
if(i==0) return new BinNode(a[i]);
else {
BinNode ln = new BinNode(a[i]);
bn=createNode(a[i-1],createTree(a,i-2),ln);
}
}
if(a[a.length-1]=="B") {
BinNode left = createNode(a[1],new BinNode(a[0]),new BinNode(a[2]));
BinNode right = createNode(a[5],new BinNode(a[4]),new BinNode(a[6]));
bn=createNode(a[3],left,right);
}
return bn;
}
private static BinNode addParenth(BinNode b) {
BinNode b1 = b;
while(!b.isLeaf()) b=b.left();
b.setElement("("+b.element());
b=b1;
while(!b.isLeaf()) b=b.right();
b.setElement(b.element()+")");
b=b1;
return b;
}
public static BinNode modifyTree(BinNode bn) {
if(!bn.left().isLeaf()&&!bn.right().isLeaf()) {
switch(bn.element().charAt(0)) {
case('+'): break;
case('-'):
if(bn.right().element()=="+"||bn.right().element()=="-")
bn.setRight(addParenth(bn.right()));
break;
case('*'):
if(bn.left().element()=="+"||bn.left().element()=="-")
bn.setLeft(addParenth(bn.left()));
if(bn.right().element()=="+"||bn.right().element()=="-")
bn.setRight(addParenth(bn.right()));
break;
case('/'):
if(bn.left().element()=="+"||bn.left().element()=="-")
bn.setLeft(addParenth(bn.left()));
bn.setRight(addParenth(bn.right()));
break;
default:break;
}
return bn;
}
else{
if((bn.left()==null||bn.left().isLeaf()) && (bn.right()==null||bn.right().isLeaf())) return bn;
else {
if (bn.element()=="/") {
if(!bn.left().isLeaf()&&(bn.left().element()=="+"||bn.left().element()=="-"))
bn.setLeft(addParenth(bn.left()));
if(!bn.right().isLeaf())
bn.setRight(addParenth(bn.right()));
} else if(bn.element()=="*") {
if(!bn.left().isLeaf()&&(bn.left().element()=="+"||bn.left().element()=="-"))
bn.setLeft(addParenth(bn.left()));
if(!bn.right().isLeaf()&&(bn.right().element()=="+"||bn.right().element()=="-"))
bn.setRight(addParenth(bn.right()));
}
else if(bn.element()=="-"&&bn.left().isLeaf()) {
if(bn.right().element()=="+"||bn.right().element()=="-")
bn.setRight(addParenth(bn.right()));
}
if(!bn.left().isLeaf()) bn.setLeft(modifyTree(bn.left()));
if(!bn.right().isLeaf()) bn.setRight(modifyTree(bn.right()));
return bn;
}
}
}
}class Output {
private HashSet rs = new HashSet();
public String traverse(BinNode rt) {
String s=new String();
if(rt==null) return s;
s+=traverse(rt.left());
s+=rt.element();
s+=traverse(rt.right());
return s;
}
public void resultTree(HashSet s) {
HashSet hs = new HashSet();
Iterator it = s.iterator();
while(it.hasNext()) {
String[] c = (String[])it.next();
//for(int i=0;i<c.length;i++)
//System.out.println(c[i]);
BinNode mbn=CTree.createTree(c,c.length-2);
hs.add(mbn);
}
Iterator hsit = hs.iterator();
while(hsit.hasNext()) {
BinNode bnt=(BinNode)hsit.next();
BinNode rbn=CTree.modifyTree(bnt);
rs.add(traverse(rbn));
//System.out.println(traverse(rbn));
}
//return rs;
}
public void prtResult() {
Iterator it = rs.iterator();
while(it.hasNext())
System.out.println((String)it.next()+"=24");
}
public HashSet getResult() {return rs;}
}
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import com.bruceeckel.swing.*;
import java.util.*;
//这个就是前台窗口的显示了!不过import了Thinking in Java 2nd中BruceEckel写的一个
//将Applet当作Application运行的方法。其实不用Applet直接用Application实现就可以了。
//早期的联系,还不太理解Applet和Application,所以呵呵,见笑。
public class Cal_24 extends JApplet {
JLabel jl1=new JLabel("Please Input 4 Source Numbers (1-13):"),
jl2=new JLabel("Show Result:");
JButton b=new JButton("Calculate");
JTextField[] t=new JTextField[4];
JTextArea ta=new JTextArea(10,15);
JScrollPane sp=new JScrollPane(ta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
class BL implements ActionListener {
public void actionPerformed(ActionEvent e) {
String[] str=new String[4];
boolean legalNum=true;
Collection al= new ArrayList();
for(int i=1;i<=13;i++)
al.add(Integer.toString(i));
for(int i=0;i<t.length;i++) {
str[i]=t[i].getText();
if(!al.contains(str[i])) {
legalNum=false;
break;
}
int j=Integer.parseInt(str[i]);
/*if (j>13||j<1) {
legalNum=false;
break;}*/
}
if(legalNum) {
Cal24 cal24 = new Cal24(str);
HashSet s = cal24.work();
if(cal24.success()) {
ta.setText("Calculation succeed!\n");
Output o = new Output();
o.resultTree(s);
s=o.getResult();
Iterator it = s.iterator();
while(it.hasNext())
ta.append((String)it.next()+"=24\n");
} else {
ta.setText("Calculation failed!\n");
}
} else {
JOptionPane.showMessageDialog(Cal_24.this,"Illegal Input!","Warning!",
JOptionPane.WARNING_MESSAGE);
}
}
}
public void init() {
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
for(int i=0;i<t.length;i++)
t[i]=new JTextField(2);
b.addActionListener(new BL());
cp.add(jl1);
for(int i=0;i<t.length;i++)
cp.add(t[i]);
cp.add(b);
cp.add(jl2);
ta.setEditable(false);
cp.add(sp);
}
public static void main(String[] args) {
Console.run(new Cal_24(),260,350);
}
}
肯定要有括号。给你一个组合, (3, 1, 5, 1) 如果不加括号,就是无解,但是一眼就能看出(3+1)*(5+1)Python的代码比Java的少,不是说说的,你可以到文档区去看。而且我的程序,并不仅限于用4个数算24,从理论上讲它能用任意多的数算24。To: Schlemiel(维特根斯坦的扇子)
最后那个还差不多。50~60行吧。
a@b@c@d
(a@b)@c@d
a@(b@c)@d
a@b@(c@d)
(a@b)@(c@d)
(a@b@c)@d
a@(b@c@d)
第一,那每个人对程序的要求不一样,如果只要一个解就行,那当然不存在问题;第二,括号也穷举,那你就要解决字符串转化表达式的问题,“(a@b@c)@d”的字串程序如何认得来计算?所以这同样也是一个难点。坛子里不是很多人都问怎么把字串变成表达式的吗?