枚举与剪枝_观察算式(比标准答案还要牛B)
观察算式
观察以下的算式:
△△△ * △△ = △△△△
某3位数乘以2位数,结果为4位数
要求:在9个△所代表的数字中。1~9的数字恰好每一个出现1次。
暴力破解代码:
package lianxijihe; import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
long pre = System.currentTimeMillis();
int a1 ;
int a2 ;
int a3 ;
int a4 ;
int a5 ;
int a6 ;
int a7 ;
int a8;
int a9 ;
for (int i = 102; i <= 999; i++) {
a1 =i / 100;
a2 =i / 10 % 10;
a3 =i % 10; // if (a1 * a2* a3 == 0)
// continue ;// 假设包括0就退出
// if (a1== a2|| a2== a3
// || a1 == a3)
// continue ;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 99; j++) {
set.add(a1);
set.add(a2);
set.add(a3);
a4 =j / 10;
a5 =j % 10;
// if (a4*a5 == 0){
// set.clear();
// continue L2;// 假设包括0就进行下一轮循环
// }
// if (a4 == a5)
// {
// set.clear();
// continue L2;// 假设他们中有一对是相等就进行下一轮循环
// } int k = i * j;
if (k >= 1023 && k <= 9999) {// 假设他们的结果是4位不反复数字
a6=k / 1000;
a7=k / 100 % 10;
a8=k / 10 % 10;
a9=k % 10;
set.add(a4);
set.add(a5);
set.add(a6);
set.add(a7);
set.add(a8);
set.add(a9);
if (set.contains(0))
set.clear();
if (set.size() == 9) {// SET集合里一共同拥有9个元素说明找到了9个不反复的数字
System.out.println(i + "*" + j + "=" + k);
} }
set.clear();// 清除
}
}
System.out.println(System.currentTimeMillis() - pre); }
}
执行时间是46毫秒。
做了减枝推断后代码
package lianxijihe; import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
long pre = System.currentTimeMillis();
int a1 ;
int a2 ;
int a3 ;
int a4 ;
int a5 ;
int a6 ;
int a7 ;
int a8;
int a9 ;
for (int i = 102; i <= 999; i++) {
a1 =i / 100;
a2 =i / 10 % 10;
a3 =i % 10; if (a1 * a2* a3 == 0)
continue ;// 假设包括0就退出
if (a1== a2|| a2== a3
|| a1 == a3)
continue ;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 99; j++) {
set.add(a1);
set.add(a2);
set.add(a3);
a4 =j / 10;
a5 =j % 10;
if (a4*a5 == 0){
set.clear();
continue L2;// 假设包括0就进行下一轮循环
}
if (a4 == a5)
{
set.clear();
continue L2;// 假设他们中有一对是相等就进行下一轮循环
} int k = i * j;
if (k >= 1023 && k <= 9999) {// 假设他们的结果是4位不反复数字
a6=k / 1000;
a7=k / 100 % 10;
a8=k / 10 % 10;
a9=k % 10;
set.add(a4);
set.add(a5);
set.add(a6);
set.add(a7);
set.add(a8);
set.add(a9);
if (set.contains(0))
set.clear();
if (set.size() == 9) {// SET集合里一共同拥有9个元素说明找到了9个不反复的数字
System.out.println(i + "*" + j + "=" + k);
} }
set.clear();// 清除
}
}
System.out.println(System.currentTimeMillis() - pre); }
}
执行时间是32毫秒
最优的标准答案是:
package lianxijihe;
public class lianxi012
{
public static void main(String[] args)
{
long pre = System.currentTimeMillis();
for(int x=10; x<100; x++){
int a = x/10;
int b = x%10;
if(a==0 || b==0 || a==b) continue;
L1: for(int y=100; y<1000; y++){
int c = y / 100;
int d = y % 100 / 10;
int e = y % 10;
if(c*d*e==0) continue;
if(c==a || c==b) continue;
if(d==a || d==b || d==c) continue;
if(e==a || e==b || e==c || e==d) continue; int z = x * y;
if(z<1000 || z>=10000) continue; // 结果不是4位数 // 分解为位
int[] r = new int[4];
for(int i=0; i<r.length; i++){
r[i] = z % 10;
z /= 10; // 与乘数或被乘数有反复
if(r[i]==0) continue L1;
if(r[i]==a || r[i]==b || r[i]==c || r[i]==d || r[i]==e) continue L1;
} // 本身反复
if(r[0]==r[1] || r[0]==r[2] || r[0]==r[3]) continue;
if(r[1]==r[2] || r[1]==r[3]) continue;
if(r[2]==r[3]) continue; System.out.println(x + " * " + y + " = " + x*y);
}
}
System.out.println(System.currentTimeMillis() - pre);
}
}
执行仅仅有6毫秒 !
! 简直牛B。。
。
最新改进仅仅要3毫秒比标准答案还要牛B
package lianxijihe; import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) { int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
int a8;
int a9;
long pre = System.nanoTime();
for (int i = 102; i <= 987; i++) {
a1 = i / 100;
a2 = i / 10 % 10;
a3 = i % 10; if (a1 * a2 * a3 == 0)
continue;// 假设包括0就退出
if (a1 == a2 || a2 == a3 || a1 == a3)
continue;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 98; j++) {
int k = i * j; if (k >= 1023 && k <= 9876) { a4 = j / 10;
a5 = j % 10;
if (a4 * a5 == 0) {
continue L2;// 假设包括0就进行下一轮循环
}
if (a4 == a5 || a4 == a1 || a4 == a2 || a4 == a3
|| a5 == a1 || a5 == a2 || a5 == a3) {
continue L2;// 假设他们中有一对是相等就进行下一轮循环
} a6 = k / 1000;
a7 = k / 100 % 10;
a8 = k / 10 % 10;
a9 = k % 10;
if(a9%2!=0)continue L2;
if (a6 * a7 * a8 * a9 == 0) {
continue L2;
}
if (a6 == a1 || a6 == a2 || a6 == a3 || a6 == a4
|| a6 == a5 || a7 == a1 || a7 == a2 || a7 == a3
|| a7 == a4 || a7 == a5 || a7 == a6) {
continue L2;
}
if (a8 == a1 || a8 == a2 || a8 == a3 || a8 == a4
|| a8 == a5 || a8 == a6 || a8 == a7) {
continue L2;
}
if (a9 == a1 || a9 == a2 || a9 == a3 || a9 == a4
|| a9 == a5 || a9 == a6 || a9 == a7 || a9 == a8) {
continue L2;
}
System.out.println(i + "*" + j + "=" + k); } }
}
System.out.println(System.nanoTime() - pre); }
}
枚举与剪枝_观察算式(比标准答案还要牛B)的更多相关文章
- 详解HTTP中GET与POST的区别,不是你看过的标准答案!
防吐槽声明:本文适合程序员新人,自认阅文无数.技术超叼的大神不用看. GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含 ...
- GET和POST本质上有什么区别,这才是标准答案
不知道各位读者在面试的时候,有没有被问过这个问题:"请说一下GET和POST两者的本质区别".基本上做过WEB开发的,对这个问题,都可以回答出一堆的区别. 比如: 最直接的区别,G ...
- C语言试题(标准答案)
C语言试题(标准答案) 一.单选题(每小题2分,共20小题40分) 1.1-1.5 B D A C B 1.6-1.10 C A D B C 1.11-1.1 ...
- C语言编程规范试题(标准答案)
C语言编程规范试题(标准答案) 一.单选题(每小题3分,共20小题60分) 1.1-1.5 B D A C B 1.6-1.10 C A D B C 1.11 ...
- JAVA可能问的几个面试题问题及问题的标准答案
问题一:你希望工作环境是怎样的? 标准答案:我对环境没有苛求,我会努力适应环境的. 注:此问题是在测试你的求职心态,是以自己为中心还是以工作为中心. 问题二:你觉得自己有哪些缺点? 标准答案:说一些对 ...
- HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...
- c#中[Flags] 枚举类型定义问题_百度知道
[Flags]的微软解释是“指示可以将枚举作为位域(即一组标志)处理.”其实就是在编写枚举类型时,上面附上Flags特性后,用该枚举变量是既可以象整数一样进行按位的“|”或者按位的“&”操作了 ...
- POJ-1190-生日蛋糕-DFS(深搜)-枚举-多重剪枝
题目链接: 这个题目非常好,有难度:能够好好的多做做: #include<iostream> #include<string> #include<cstdio> # ...
- c++_凑算式(最新方法)
凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3 ...
随机推荐
- Zabbix监控Linux主机设置
说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对Linux主机进行监控. 具体操作: 以下操作在被监控的Linux主机进行,这里以CentOS 6.x系统为例. 一.配 ...
- GDI+简单现实文字旋转
原文 http://www.cnblogs.com/kaixiangbb/p/3301272.html 题记 入职新公司已快有两月了,试用期已快结束,项目却迟迟还未正式启动.安排给我的多是些琐事,一直 ...
- svn常见问题汇总
has no ancestry information 经查,由于project/,01Dev/的权限被关闭了,把当前文件夹父目录(project/,01Dev/) 下的 .svn/ 目录删除就好了.
- 用Express搭建 blog (一)
Info 公司马上要举行 hack day 了,这次决定和小伙伴用 Express 作为框架来搭建我们的应用,所以昨天搭出来UI后,今天开始系统的学习下 Express. Start 首先是expre ...
- POJ——放苹果
4:放苹果 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) ...
- hdu 2604 Queuing(矩阵快速幂乘法)
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- 函数(jquery)
<script type="text/javascript"> function makeArray(arg1, arg2){ return [ this, ar ...
- Math.round(11.5)等于()Math.round(-11.5)等于()
几天前去面试,这道简单的题目居然做错了,看来基础就是慢慢积累的.并不断使用和复习才会成为高手,假设基础不是那么熟练.恐怕在成为高手的路上会困难重重.所以在做项目的间歇时间.偶尔回顾一下最基础的知识.是 ...
- DOM注意事项(八):JavaScript操作环境和垃圾收集
一.运行环境 在约JavaScript对象或this当指向问题,念就是运行环境.即上下文环境.运行环境在JavaScript是一个非常重要的概念.由于它定义了变量或函数有权訪问的其他数据,决定了它们各 ...
- js复制button在ie下的解决方式
源代码例如以下: <input class="width200" maxlength="32" type="text" id=&quo ...