小X与神牛(dfs)
小X与神牛
时间限制: 1 Sec 内存限制: 128 MB
题目描述
小X在野外遇到了一种神奇的牛,并将其命名为“神牛”。
神牛都长着B只角,B只角从左到右在头顶上排成一排。每只角上都标着数字,不是0就是1。小X将每头神牛的B只角上的数字从左到右依次取出,组成一个只含0或1的B位二进制数。小X将这个二进制数转化为十进制,用这个十进制数来代表一头神牛,这个十进制就是这头神牛的编号。
神牛们之间的关系是很微妙的,如果两头神牛的第i只角上的数字不同,则称这两头神牛的第i只角是不一样的。如果两头神牛不同的角的数目大于等于D,则称这两头神牛是友好的。比如当B=8,D=2时,
01010100
00110100
xx
这两头神牛的第2和第3只角不同(x指向的位置),不同的角的数目为2,所以这两头神牛是友好的。
现在小X向你求助:请找出N头神牛,使得任意两头神牛都是友好的,并将这N头神牛的编号按从小到大排序后依次输出。如果有多种符合条件的解,那么排在越前面的牛的编号越小越好。
输入
输入仅有一行包含3个用空格隔开的正整数,分别表示 N, B, D。
输出
输出仅有一行包含N个非负整数,相邻两个数之间用一个空格隔开,表示N头神牛的编号。如果有多解,你的程序要输出这样的解:越前面的牛的编号越小越好。
样例输入
复制样例数据
3 5 3
样例输出
0 7 25
提示
每头神牛都长着7只角,若两头神牛不同的角的数目大于等于3,则这两头神牛是友好的。现在要找出16头相互都友好的神牛。
答案是0000000, 0000111, 0011001, 0011110, 0101010, 0101101, 0110011, 0110100, 1001011, 1001100, 1010010, 1010101, 1100001, 1100110, 1111000, 1111111,转化为十进制就是0 7 25 30 42 45 51 52 75 76 82 85 97 102 120 127
对于30%的数据,1<=D<=B<=8,1<=N<=3
对于另外10%的数据,D=1
对于另外30%的数据,D=2
对于100%的数据,1<=D<=B<=8, 1<=N<=16
数据保证有解。
首先题目要求值越小越好,那么就从0开始。用字符串存储长度为B的二进制,然后从第一位到第b位枚举一遍,为了使不相同的值越多,那么不相同的位数从d位开始,所以dfs时每一位从0开始,然后再为1。。。
最后存储比较完事。
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>typedef long long LL;
using namespace std;int n, b, d, ans[20], num;
string s[1005];int pow(int x, int nu){int res = 1;for (int i = 0; i < nu; i++) res *= x;return res;
}void dfs(int len, string str){if(len == b){int f = 0;for (int i = 0; i < num; i++){//与已有的答案进行比较,如果不同的值大于d存储int nu = 0;for (int j = 0; j < b; j++){if(s[i][j] != str[j]) nu++;}if(nu < d){f = 1; break;}}if(!f) s[num++] = str;return ;}for (int i = 0; i <= 1; i++) dfs(len + 1, str + (char)('0' + i));
}int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);scanf("%d %d %d", &n, &b, &d);for (int i = 1; i <= b; i++) s[0] += '0';num = 1;dfs(0, "");for (int i = 0; i < num; i++){//每个数转化成10进制int num = 0;for (int j = 0; j < b; j++){num += (s[i][j] - '0') * pow(2, b - j - 1);}ans[i] = num;}sort(ans, ans + num);//从小到大排序for (int i = 0; i < n; i++) printf("%d ", ans[i]);return 0;
}
/**/
小X与神牛(dfs)相关推荐
- 数独小项目开篇:DFS解决数独难题
数独小项目开篇:DFS解决数独难题 前言 DFS解决数独问题思路 代码实现细节 样例测试 总结 Reference 前言 这周小刀是挺忙的,周末加班,哎,谁不是996呢?(打工魂燃烧吧~ 这次 ...
- 小 Biu 的旅行(dfs)
题目描述 小Biu所在的城市有n个景点,有一些景点之间有单向联通的道路,现在小Biu在1号景点上,他想知道到达除了1号景点之外的每个景点分别最少需要经过多少条道路? 如图所示为样例数据,可以知道小Bi ...
- 小x与三角形 c语言 1秒,[2019年第一水] 小x与神牛
题目描述 小X在野外遇到了一种神奇的牛,并将其命名为"神牛". 神牛都长着B只角,B只角从左到右在头顶上排成一排.每只角上都标着数字,不是0就是1.小X将每头神牛的B只角上的数字从 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- 【HDU3949 + BZOJ2115 + CF724G】【异或线性基例题】| 倍增 | 第k小异或和 | DFS处理环 |【CGWR】| N
三道关于异或线性基的有趣的题目 [1] HDU 3949. XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- ACM 小蝌蚪安家 简单DFS
描述 在一个矩形区域内,有些地方有水,有些地方没水.所有相邻的有水的地方会共同组成一个水洼,小蝌蚪想在这块区域中找到一个最大的水洼来安家. 输入 有多组输入数据,每组第一行包含两个正整数n,m(n,m ...
- hrbust 1614 小z的地图 dfs
小z的地图 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 101(30 users) Total Accepted: 28(24 us ...
- 1916. 统计为蚁群构筑房间的不同顺序 费马小定理+快速幂+DFS
1916. 统计为蚁群构筑房间的不同顺序 你是一只蚂蚁,负责为蚁群构筑 n 间编号从 0 到 n-1 的新房间.给你一个 下标从 0 开始 且长度为 n 的整数数组 prevRoom 作为扩建计划.其 ...
- 部分和问题 (dfs搜索 尺取)
部分和问题 给定整数a1, a2, a3, a4, .......... , an ,判断是否可以从中取出若干个数,使得他们的和恰好为k . 1 <= n <= 20 测试数 ...
最新文章
- Java控制内存的功力
- 区块链系统之《一种基于区块链的云数据共享方法》
- 圈子 | 苏宁易购产品经理:平台支撑型产品的思维方式
- eWeek: 三巨头Web应用服务对比
- 机器学习(四) 下采样和上采样
- C# 之 static的用法详解
- android sqlite orm,ioc,Afinal 0.2 发布 Android的快速开发框架(ORM,IOC)
- 为什么整个互联网行业都缺前端工程师?
- Java异常处理之InvocationTargetException(反射异常)
- Asp.net高效导出excel篇之Aspose导出excel
- 实战matlab之文件与数据接口技术,实战MATLAB之文件与数据接口技术
- django 与 mysql 勾结指南
- linux 查看运行平台,linux查看程序运行相关命令
- 汉王考勤管理系统教程
- 《流畅的Python第二版》读书笔记——文本和字节序列
- 游戏业务DDoS攻防对抗案例分享
- win32Day06:控件
- 云时代,最好用的MySQL客户端工具推荐
- 【Mockplus教程】如何修改手机外壳?
- onedrive php映射,宝塔面板搭建OneDrive目录程序OLAINDEX