题目描述

将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. 【bzoj4443】[Scoi2015]小凸玩矩阵

    第K大也就是第n-K+1小,所以就可以的二分答案了 (江哥讲过一道类似题) 二分答案找出比当前答案小的数的位置的坐标,判断一下是否可以选出满足不在同一行同一列的n-K+1个数,然后就可以跑匈牙利了,对 ...

  2. Java 过滤器、监听器、拦截器的区别

        原文:http://www.360doc.com/content/10/0601/09/495229_30616324.shtml 1.过滤器 Servlet中的过滤器Filter是实现了ja ...

  3. 迟到的WC2019打铁祭

    这是我最失败的一次考试... 具体过程就不说了,全程划水,掉线.还是自身实力不行啊. 最后文艺汇演,本人是DL24主唱&&rapper,欢迎大家交友.^_^.

  4. 通过usb访问mtp设备(ubuntu12.04) (转载)

    转自:http://robert.penz.name/658/howto-access-mtp-devices-via-usb-on-ubuntu-12-04/ A friend asked me h ...

  5. Unity ScriptObject

    http://godstamps.blogspot.com/2012/02/unity-3d-scriptableobject-assetbundle.html http://ivanozanchet ...

  6. bzoj 1599: [Usaco2008 Oct]笨重的石子【枚举】

    --我为什么要写这种题解-- 枚举投掷情况即可 #include<iostream> #include<cstdio> using namespace std; int s1, ...

  7. poj2096Collecting Bugs(概率期望dp)

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 6400   Accepted: 3128 ...

  8. $CF19A\ World\ Football\ Cup$

    炒鸡\(6\)批的模拟题. 注意的是输入 把握好空格 大小写. 根据题目的这句话来排序 积分榜是按照以下原则制作的:胜利一个队得3分,平分1分,失败0分. 首先,球队按积分顺序排在积分榜上,分数相等比 ...

  9. [Usaco2013 Nov]No Change

    Description Farmer John is at the market to purchase supplies for his farm. He has in his pocket K c ...

  10. excel 录入oracle 方法

    http://blog.itpub.net/28602568/viewspace-1797410/ 1.方法1:外部表 1.将excel另存为.txt格式(2种txt 格式都可以),再传到数据库dir ...