洛谷 P1461海明码 Hamming Codes 枚举 搜索

洛谷 P1461海明码 Hamming Codes
枚举 搜索

 1 #include <bits/stdc++.h>
 2 using namespace std ;
 3
 4 const int N = 11 ;
 5 int mx,B,n,D ;
 6 int bin[N] ;
 7 struct base{
 8     bool f[ N ] ;
 9     inline void clear() {
10         for(int i=1;i<N;i++) f[ i ] = 0 ;
11     }
12     inline void insert(int x) {
13         int cnt = 0 ;
14         while( x ) {
15             f[ ++cnt ] = x&1 ;
16             x = x>>1 ;
17         }
18     }
19     inline void output() {
20         int ans = 0 ;
21         for(int i=1;i<N;i++)
22             ans+=f[ i ] * bin[ i ] ;
23         printf("%d ",ans) ;
24     }
25 }a[71];
26
27 inline int diff(base a,base b)
28 {
29     int cnt = 0 ;
30     for(int i=1;i<N;i++) if(a.f[ i ]!=b.f[ i ]) cnt++ ;
31     return cnt ;
32 }
33
34 inline void dfs(int x,int s,int t)
35 {
36     if( x == n+1 ) {
37         for(int i=1;i<=n;i++) {
38             a[ i ].output() ;
39             if(i%10==0) printf("\n") ;
40         }
41         exit(0) ;
42     }
43     bool flag ;
44     base p ;  p.clear() ;
45     for(int i=s;i<=t;i++) {
46         flag = false ;
47         p.insert( i ) ;
48         for(int j=1;j<x;j++)
49             if( diff( a[ j ],p )<D )
50                 flag = 1 ;
51          if(flag==false) {
52              a[ x ] = p ;
53              dfs(x+1,i+1,t) ;
54              break ;
55          }
56     }
57 }
58
59 int main()
60 {
61     scanf("%d%d%d",&n,&B,&D) ;
62     bin[ 1 ] = 1 ;
63     for(int i=2;i<N;i++) bin[ i ] = bin[ i-1 ] * 2 ;
64     mx = (1<<B) ;
65     a[ 1 ].insert(0) ;
66     dfs( 2,1,mx ) ;
67
68     return 0 ;
69 }
时间: 2024-11-04 12:52:22

洛谷 P1461海明码 Hamming Codes 枚举 搜索的相关文章

洛谷 P1461 海明码 Hamming Codes

P1461 海明码 Hamming Codes 题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7).“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目.看下面的两个编码 0x554 和 0x234(0x554和0x234分别表示两个十六进制数): 0x554 = 010

洛谷 P3625 [APIO2009]采油区域【枚举】

参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog懒得画了 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1505; int n,m,k,a[N][N],b[N][N],c[N][N],d[N][N],s[N][N],p

洛谷OJ 1074 靶型sudoku dfs(搜索顺序优化)

https://www.luogu.org/problem/show?pid=1074 题意:靶型sudoku 问填完的最大得分?//优化:从可能性小的开始搜索,把地图分数设置成常量数组,接着暴力即可 #include <bits/stdc++.h> using namespace std; const int N=2e2+20; int row[N][N],col[N][N],vis[N][N];//row[i][1~9] 第i列是否能选j int a[N][N]; int ans,n=9,

洛谷P1019 单词接龙

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,

洛谷P2327 [SCOI2005]扫雷 枚举 搜索

洛谷P2327 [SCOI2005]扫雷 枚举 搜索 对搜索的 一些优化 其实我们只要枚举第一行是否有地雷,根据第1行探测出的地雷数,就可以推出第二行是否有地雷 然后在根据第二行探测地雷数推出第三行的情况,这样以此类推,一直推到第 n-1 的探测结果,然后 推出第 n 行是否有地雷如果在推的过程中 使得当前的探测地雷数为 负数 ,说明这个方法是萎的, 或者这一行推完了之后,还是有雷,那也退出,最后还要判断一下第 n 行是否有地雷 1 #include <cstdio> 2 #include &

洛谷P1081 开车旅行

P1081 开车旅行 152通过 524提交 题目提供者洛谷OnlineJudge 标签倍增NOIp提高组2012 难度省选/NOI- 提交该题 讨论 题解 记录 最新讨论 我前排提醒一下 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi−

洛谷P3385 【模板】负环 DFS-SPFA 判负环 图论

洛谷P3385 [模板]负环 图论 今天get了 一个 DFS-SPFA 判负环的方法 一般的 BFS-SPFA 判负环 一般就是 不停地做,如果某点第 n+1次加入队列中,那么说明这个图存在负环然而我并不会证明,期望复杂度是 O(kM) k 大约是在 2 左右 但是其实对于一些极限数据,最坏可以把他卡到 O( NM) 额,这就直接炸飞了是不是,而且据说,一些数据比较强的题目,总会想到卡一卡SPFA的, 然后我们换一种思路 因为题目中一定存在一种 负环对吧,所以说假如你某段路径权值和为自然数的时

【洛谷】【洛谷月赛】4月月赛Round 1/2

洛谷月赛"月"来"月"丧了,一月更比一月丧,做得我十分不"月"-- 4月的两轮月赛,都只会T1,就写一下吧,等待后续更新-- 先看看Round1的T1: [R1T1] 网址:点我 [题意简述] 给定一个长度为n的序列,其中的元素均是1~m之间的正整数. 要求从中选出k个数,交换它们的位置,其他未被选中的数保持不变,使得变换后的序列中,相等的数总是排在一段连续区间. 要求最小化k. 1<=n<=105,1<=m<=20 [思

洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的方格的列表.你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚.牛棚的边必须和水平轴或者垂直轴平行. EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,‘#'表示有树的方格 1 2 3 4 5 6 7 8 1 .