题目描述

将1,2, ⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

输入输出格式

输入格式:

木有输入

输出格式:

若干行,每行3个数字。按照每行第1个数字升序排列。

输入输出样例

输入样例#1:

输出样例#1:

192 384 576



(输出被和谐了)

分析:

题意为输出3个三位数,如何将所有的三位数罗列出来?只用一个for循环生成三个排列的数不简单,可以考虑使用三个for循环,按照百位、十位、个位拼接成三位数。仅仅得到一个三位数如何找到另外两个三位数呢?题意说明1-9各用一次,正面求解不方便可以直接将得到的三位数乘以2,乘以3,判断是否9个数字全部用上

int main() {
for (int i = 1; i <= 9; ++i) {
for (int j = 0; j <= 9; ++j) {
for (int k = 0; k <= 9 ; ++k) {
int a = i*100+j*10+k;
int b = a*2;
int c = a*3;
if(b>999||c>999)continue;
nums[i]=1;
nums[j]=1;
nums[k]=1;
nums[b/100]=1;
nums[(b/10)%10]=1;
nums[b%10]=1;
nums[c/100]=1;
nums[(c/10)%10]=1;
nums[c%10]=1;
if(nums[1]==1&&nums[2]==1&&nums[3]==1&&nums[4]==1&&nums[5]==1&&nums[6]==1&&nums[7]==1&&nums[8]==1&&nums[9]==1)
printf("%d %d %d \n",a,b,c);
for (int l = 0; l < 10; ++l) {
nums[l] = 0;
}
}
}
}
return 0;
}

简单优化:

void sanlie(int no){
while (no!=0){
nums[no%10]=1;//取最后一位,做散列查表
no/=10;//消除最后一位
}
}
int main() {
for (int i = 1; i <= 9; ++i) {
for (int j = 0; j <= 9; ++j) {
for (int k = 0; k <= 9 ; ++k) {
int a = i*100+j*10+k;
int b = a*2;
int c = a*3;
if(b>999||c>999)continue;
sanlie(a);
sanlie(b);
sanlie(c);
if(nums[1]==1&&nums[2]==1&&nums[3]==1&&nums[4]==1&&nums[5]==1&&nums[6]==1&&nums[7]==1&&nums[8]==1&&nums[9]==1)
printf("%d %d %d \n",a,b,c);
memset(nums,0, sizeof(nums));
}
}
}
return 0;
}

学到的点:

1、使用百位+十位+个位的方式构造数值

2、使用memset()重置数组,比for循环高效

3、使用数值中出现的数字作为数组的下标,表示是否出现(散列法、查表法),第一次的想法为利用数组存放三个三位数出现的数字,下标为自然0-9,需要比较各不相同(1,2…9),相比散列只需比较是否出现(为1)

4、求数组长度sizeof(nums)/ sizeof(nums[0]),sizeof求得是字节长度(下面的例子)


不太懂循环怎么写,于是尝试了下:

void xunhuan() {
for (int i = 1; i < 10; ++i) {
for (int j = 1; j < 10; ++j) {
for (int k = 1; k < 10; ++k) {
for (int l = 1; l < 10; ++l) {
for (int m = 1; m < 10; ++m) {
for (int n = 1; n < 10; ++n) {
for (int i1 = 1; i1 < 10; ++i1) {
for (int j1 = 1; j1 < 10; ++j1) {
for (int k1 = 1; k1 < 10; ++k1) {
int a = i * 100 + j * 10 + k;
int b = l * 100 + m * 10 + n;
int c = i1 * 100 + j1 * 10 + k1;
int nums[10] ={i,j,k,l,m,n,i1,j1,k1};
int flag = 1;
for (int l1 = 0; l1 < sizeof(nums)/ sizeof(nums[0]); ++l1) {
for (int m1 = l1+1; m1 < sizeof(nums)/ sizeof(nums[0]); ++m1) {
if(nums[m1]==nums[l1]) {
flag=0;
break;
}
}
if(flag == 0)break;
}
if (a * 2 == b && a * 3 == c && b < 1000 && c < 1000&&flag) {
printf("%d %d %d \n", a, b, c);
}
}
}
}
}
}
}
}
}
}
}

暴力搜索+散列--P1008 三连击的更多相关文章

  1. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  2. 随手练——洛谷-P1151(枚举与暴力搜索)

    枚举 #include <iostream> using namespace std; int main() { ; cin >> k; ; i < ; i++) { ) ...

  3. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  4. ACM 暴力搜索题 题目整理

    UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vec ...

  5. DotNet加密方式解析--散列加密

    没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...

  6. Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...

  7. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...

  8. [No0000132]正确使用密码加盐散列[译]

    如果你是一个 web 开发工程师,可能你已经建立了一个用户账户系统.一个用户账户系统最重要的部分是如何保护密码.用户账户数据库经常被黑,如果你的网站曾经被攻击过,你绝对必须做点什么来保护你的用户的密码 ...

  9. 【Redis学习之五】Redis数据类型:列表和散列

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...

随机推荐

  1. [IOI2005]Riv 河流

    https://www.zybuluo.com/ysner/note/1300088 题面 有一棵\(n\)个点的树,现在在上面放\(k\)个标记,使得每个点的权值乘上自己到最近的标记祖先的距离的和最 ...

  2. Spark 多项式逻辑回归__二分类

    package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{L ...

  3. bzoj 1575: [Usaco2009 Jan]气象牛Baric【dp】

    完了不会dp了 设f[i][j]为以i结尾,有j个时的最优值,辅助数组g[i][j]为s选了i和j,i~j中的误差值 转移是f[j][i]=min(f[k][i-1]+g[k][j]) #includ ...

  4. JPA中关联关系(OneToOne、OneToMany、ManyToMany,ManyToOne)映射代码片段

    在使用Hibernate的时候我们常常会在类里边配置各种的关联关系,但是这个并不是很好配置,配置不当会出现各种各样的问题,下面具体来看一下: 首先我们来看User类里边有一个IdentityCard类 ...

  5. javascript实现继承的4种方法,以及它们的优缺点

    1. 原型链继承(有缺陷): 缺陷1:切断了Zi.prototype.constructor与Zi的关系 缺陷2:原型链上的引用类型的数据会被所有实例共享 2. 构造函数继承(有缺陷): 缺陷1:Fu ...

  6. python自动化测试学习笔记-9测试框架

    学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:

  7. Windows Server 2008 R2关闭FTP服务

    公司在ZJ的项目给了一台互联网可以访问的测试服务器,但是只给了三个访问端口,而且还做了映射. 映射信息如下:[1050->3389,1051->50000,1053->21] 其中1 ...

  8. 视图解析器InternalResourceViewResolver在什么情况下需要配置?在什么情况下不需要配置?

    如果路径名是逻辑名的话,必须配置 -------------- 相对路径,即逻辑名称如果路径名是真实名的话,可选配置 若是绝对路径,则不用配置,即真实名称 注:试一下逻辑名和真实名的例子*****有用 ...

  9. 401 Binary Watch 二进制手表

    详见:https://leetcode.com/problems/binary-watch/description/ C++: class Solution { public: vector<s ...

  10. idea工程jdk设置问题

    经常用idea的朋友,会遇到一个问题,那就是你在单测的时候,会报一个jdk的错,截图如下: 我的解决方案是在pom.xml里配置一个节点: <properties> <maven.c ...