算法竞赛入门 例题7-1 最优程序

来源:互联网 发布:网络信息服务费合同 编辑:程序博客网 时间:2024/05/22 06:18
/*算法竞赛入门经典 例题7-1 最优程序  * BFS 栈和队列 * */import java.util.LinkedList;import java.util.Scanner;class Node {String pre;// 之前的操作步骤int op;// 当前操作符 0:ADD, 1:SUB, 2:MUL, 3:DIV, 4:DUPLinkedList<Integer> stack = new LinkedList<Integer>();// 数据栈Node createNode() {//由当前节点创建出新节点Node node = new Node();node.pre = new String(this.pre);node.op = this.op;node.stack = new LinkedList<Integer>(this.stack);return node;}}public class BestProgram {static LinkedList<Node> queue = new LinkedList<Node>();static int a, b;static Node n = new Node();public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {a = scanner.nextInt();b = scanner.nextInt();queue.clear();dfs();System.out.println(n.pre);}}private static void dfs() {n.pre = "";n.op = 4;n.stack.push(a);queue.offer(n);while (queue.size() > 0) {n = queue.poll();op();int num = n.stack.getFirst();if (num == b)return;for (int i = 0; i < 5; i++) {Node node = n.createNode();node.op = i;switch (i) {case 0:case 1:case 2:case 3:if (node.stack.size() < 2)break;if (i == 3 && node.stack.getFirst() == 0)break;case 4:queue.offer(node);}}}}private static void op() {int s1 = 0, s2 = 0;if (n.op != 4) {s1 = n.stack.pop();s2 = n.stack.pop();} else {s1 = n.stack.getFirst();}switch (n.op) {case 0:n.stack.push(s1 + s2);n.pre += "ADD ";break;case 1:n.stack.push(s2 - s1);n.pre += "SUB ";break;case 2:n.stack.push(s1 * s2);n.pre += "MUL ";break;case 3:n.stack.push(s2 / s1);n.pre += "DIV ";break;case 4:n.stack.push(s1);n.pre += "DUP ";break;}}}
输入输出示例5 32 10002 32 4DUP DIV DUP DUP ADD ADD DUP DUP ADD DUP ADD ADD DUP DUP MUL MUL DUP SUB MUL ADD DUP ADD 


原创粉丝点击