题目描述

将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. python 三维坐标图

    绘制3D柱状图,其数据格式为,二维数组或三维数组. from numpy import * file=open('C:\\Users\\jyjh\\Desktop\\count.txt','r') a ...

  2. 洛谷 P1084 疫情控制 —— 二分+码力

    题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...

  3. C的结构体函数

    #include<stdio.h> #include<string.h> struct Test { int age; ]; double score; }std1; //结构 ...

  4. ELK Stack总结

    目录 ELK Stack 介绍 Elasticsearch 概念1(基础) CRUD基本用法 概念2(文本解析器) 查询 分析/聚合 概念3(架构原理的补充) Logstash基础 Kibana的数据 ...

  5. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】

    只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从 ...

  6. linux vi 块操作、多窗口

    vim 块选择v:字符选择或者行选择[ctrl]+v: 块选择y:将反白的地方复制d:将反白的地方删除 多窗口:sp {filename} 打开一个新的窗口[ctrl]+w+j或者[ctrl]+w+向 ...

  7. [HAOI2006]均分数据

    题解 今天下午刚学了模拟退火 借这个题来总结下模拟退火的要注意的问题吧 1 : \(eps\)不要设的太大 2 : 初温\(T\)在2000左右就差不多可以了 3 : 注意题目要求是要求最大值还是最小 ...

  8. ACM_蛇形矩阵

    蛇行矩阵 Time Limit: 4000/2000ms (Java/Others) Problem Description: 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. Input: ...

  9. 转 MySQL实验(三) 过程式数据库对象的使用

    转 http://blog.csdn.net/anne999/article/details/70432558

  10. Scala简单计算实例,其在数据分析方面的优势体会

    程序只是简单的从文件中读取数据,并进行计算. package com.bill.www /** * Created by Bill on 2016/2/3. * 目的:用scala实现简单的数据计算 ...