枚举与剪枝_观察算式(比标准答案还要牛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 ...
随机推荐
- PBM文件格式
PBM是一种单色位图文件,常用于打印机,由于需要下面对PBM文件格式进行分析. 每个文件的开头两个字节(ASCII码)作为文件描述子,可以理解为文件头.具体如下: 头 类型 编码 P1 位图 ASCI ...
- 【翻译】MVC Music Store 教程-概述(二)
1. 文件->新建项目 软件安装 此篇将从运用免费的Visual Web Developer 2010Express来创建ASP.NET MVC3开始,逐步的添加一些功能来创建一个完整的应用程序 ...
- Qt新建线程的方法(四种办法,很详细,有截图)
看了不少Qt线程的东西,下面总结一下Qt新建一个线程的方法. 一.继承QThread 继承QThread,这应该是最常用的方法了.我们可以通过重写虚函数void QThread::run ()实现我们 ...
- Delphi XE6调用javascript
原文地址:Example of using JavaScript for Google maps in the Delphi XE6 XE6的TWebBrowser新增了EvaluateJavaS ...
- docker 容器扩盘
docker:/root/sbin# cat add_fs.sh #!/bin/bash #This script is dynamic modify docker container disk #A ...
- css案例学习之div与span的区别
代码: <html> <head> <title>div 标记范例</title> <style type="text/css" ...
- Python 操作 MySQL--(pymysql)
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- string 转换char类型
将string转换成char类型 const char *c = string.c_str() char转换string char *c_name = "char" string ...
- C++关注备注部分知识点
//关注备注部分知识点. #include <iostream> #include <string><span style="white-space:pre&q ...
- WinForm DataGridView看似刷新的问题
昨天同事winform遇到一个问题, 窗体上有一个时间控件,和一堆文本,下拉控件,时间控件是每秒都在动态走的 窗体下发一个DataGridView 控件显示保存后的数据 保存的数据库是在另一台机器B上 ...