算法笔记_220:猜算式(Java)

目录

1 问题描述

2 解决方案

 


1 问题描述

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个
三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字

,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....

请编程,输出所有可能的情况!

注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要


2 解决方案

 1 import java.util.ArrayList;
 2
 3 public class Main {
 4     public static ArrayList<String> list = new ArrayList<String>();
 5
 6     public void swap(int[] A, int i, int j) {
 7         int temp = A[i];
 8         A[i] = A[j];
 9         A[j] = temp;
10     }
11
12     public void check(int[] A) {
13         int a = A[0] * 10 + A[1];
14         int b = A[2] * 10 + A[3];
15         int c = A[4] * 10 + A[5];
16         int d = A[6] * 100 + A[7] * 10 + A[8];
17         if(a > b) {
18             int temp = a;
19             a = b;
20             b = temp;
21         }
22         if(a * b == c * d) {
23             StringBuffer s = new StringBuffer("");
24             s.append(a);
25             s.append(" x ");
26             s.append(b);
27             s.append(" = ");
28             s.append(c);
29             s.append(" x ");
30             s.append(d);
31             if(!list.contains(s.toString()))
32                 list.add(s.toString());
33         }
34     }
35
36     public void dfs(int[] A, int step) {
37         if(step == A.length) {
38             check(A);
39             return;
40         } else {
41             for(int i = step;i < A.length;i++) {
42                 swap(A, i, step);
43                 dfs(A, step + 1);
44                 swap(A, i, step);
45             }
46         }
47     }
48
49     public static void main(String[] args) {
50         Main test = new Main();
51         int[] A = {1,2,3,4,5,6,7,8,9};
52         test.dfs(A, 0);
53         for(int i = 0;i < list.size();i++)
54             System.out.println(list.get(i));
55     }
56 }

运行结果:

46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
58 x 67 = 29 x 134
58 x 69 = 23 x 174
58 x 73 = 29 x 146
58 x 96 = 32 x 174
63 x 74 = 18 x 259
64 x 79 = 32 x 158
73 x 96 = 12 x 584
76 x 98 = 14 x 532
时间: 2024-10-18 15:13:40

算法笔记_220:猜算式(Java)的相关文章

算法笔记_018:旅行商问题(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力法   1 问题描述 何为旅行商问题?按照非专业的说法,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到触发的城市之前,对每个城市都只访问一次.这样该问题就可以表述为求一个图的最短哈密顿回路的问题.(哈密顿回路:定义为一个对图的每个顶点都只穿越一次的回路) 很容易看出来,哈密顿回路也可以定义为n+1个相邻顶点v1,v2,v3,...,vn,v1的一个序列.其中,序列的第一个顶点和最后一个顶点是相同的,而其它n-1个顶点都是互不相同的.并且

算法笔记_007:猜底牌问题【贪婪法】

目录 1 问题描述 2 解决方案 2.1 贪婪法原理简介 2.2 哈夫曼树及编码简介 2.3 具体编码 2.4 运行结果 1 问题描述 设计一种策略,使在下面的游戏中,期望提问的次数达到最小.有一副纸牌,是由1张A,2张2,3张3,...9张9组成的,一共包含45张牌.有人从这副牌洗过的牌中抽出一张牌,问一连串可以回答是或否的问题来确定这副牌的点数. 2 解决方案 2.1 贪婪法原理简介 贪婪法的核心是,所做的每一步选择都必须满足以下条件: (1)可行的:即它必须满足问题的约束. (2)局部最优

算法笔记_015:快速排序(Java)

目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行

算法笔记_023:拓扑排序(Java)

目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进行排序.即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面. 2 解决方案 2.1 基于减治法实现 实现原理:不断地做这样一件事,在余下的有向图中求取一个源(source)(PS:定义入度为0的顶点为有向图的源),它是一个没有输入边的顶点,然后把它和所有从它出发

算法笔记_127:蓝桥杯2017模拟赛-本科组习题解答(Java)

 目录 1 算年龄 2 猜算式 3 排列序数 4 字符串比较 5 还款计算 6 滑动解锁 7 风险度量   PS:以下代码部分仅供参考,若有不当之处,还请路过同学指出哦~ 1 算年龄 标题:算年龄 英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩根到底出生在哪一年. 题中的年龄指的是周岁. 请填写表示他出生年份的四位数字,不要填写任何多余内容. 1806 public cl

算法笔记_071:SPFA算法简单介绍(Java)

目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高.(PS:引用自百度百科:spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛

算法笔记之排序

最近在看<算法笔记>,如果单从算法来说,这本书真正做到了短小精悍,首先以排序入题,那么我们今天也来说说排序. 排序 将一堆杂乱无章的元素按照某种规则有序排列的过程就叫"排序".排序是一种非常基础的算法,有着广泛的理论和实践基础.对一个排序算法来说,一般从如下3个方面衡量算法的优劣: 时间复杂度:主要是分析关键字的比较次数和记录的移动次数. 空间复杂度:分析排序算法中需要多少辅助内存 稳定性:若两个记录A和B的关键字值相等,但排序后A.B的先后次序保持不变,则称这种算法是稳定

算法笔记之归并排序

4.归并排序 4.1算法思想-- 将数组分为两半,对每部分递归地应用归并排序,直到最后的子数组只包含一个元素.在每部分都排好序后,对它们进行合并. 4.2 时间复杂度-- 假如用T(n)表示使用归并排序对n个元素构成的数组进行排序而使用的时间,用mergeTime来表示将两个子分组合并起来而花费的时间.那么 T(n) = T(n/2)+T(n/2) + mergetime 而megeTime就是归并两个子数组所耗费的时间,以最大时间来算,最多需要n-1次来比较两个子数组的元素,然后n次移动到临时

算法笔记-DTW动态时间规整

算法笔记-DTW动态时间规整 简介 简单的例子 定义 讨论 约束条件 步模式 标准化 点与点的距离函数 具体应用场景 分类 点到点匹配 算法笔记-DTW动态时间规整 动态时间规整/规划(Dynamic Time Warping, DTW)是一个比较老的算法,大概在1970年左右被提出来,最早用于处理语音方面识别分类的问题. 1.简介 简单来说,给定两个离散的序列(实际上不一定要与时间有关),DTW能够衡量这两个序列的相似程度,或者说两个序列的距离.同时DTW能够对两个序列的延展或者压缩能够有一定