URAL 1792 Hamming Code

来源:互联网 发布:json对象多层嵌套解析 编辑:程序博客网 时间:2024/06/16 08:49

    链接:URAL 1792 

    题意:题目介绍了汉明码的编码方式,具体规则为:如图,如今有四个圆标号为 I II III IV以图中的形式相交,可认为每个圆代表一个数字,这个数字为 0 或 1,我们标记 3 个圆相交在一起的部分为阴影,标为 1,2, 3,这些阴影部分的编码是由形成它们的圆所代表的数字来决定的,具体规则为 把三个相交的圆所代表的数字加起来的和对2 取模,就是该阴影部分的编码。所以,假如圆 I 代表 0,圆 II 代表 1,圆 III 代表 0,圆 IV 代表 1,那么,因为阴影 1 是由圆 II 、圆 III 、圆 IV 相交形成,故阴影1的编码就是 (1+0+1)%2 = 0, 同理,阴影 2 的编码为 1,阴影 3 的编码为 0. 现在给出 7 个数字(0 和 1),前四个为四个圆按顺序所代表的数字,后三个为三个阴影部分按编号代表的数字,数据保证了输入的 7个数字只有两种情况:1.已经符合汉明码的编码规则了。2. 改动其中的一位后可以变成符合规则的汉明码。现在要求根据输入输出一串汉明码,与输入最多有 1 个数字的不同,每两个数字间带一个空格。

    思路:数据很小,故可以枚举。首先判断输入的数据是否是汉明码,是则不执行枚举循环,不是则开始枚举。对输入的每一个数字做取反操作,使之从 0 变 1 或从1 变 0,然后判断取反后的编码是否符合汉明码规则,是则跳出枚举,不是则再对该位数字进行取反,恢复原值,然后继续枚举,直到找到符合的汉明码。最后输出汉明码。

    对汉明码的检验方法很容易求得: 阴影 1 = (圆 II + 圆 III + 圆IV)%2;阴影 2 = (圆 I + 圆 III + 圆 IV)%2;阴影 3 = (圆 I + 圆 II + 圆 IV)%2.以上三个条件成立则为汉明码。


#include <iostream>using namespace std;int code[10];//判断是否是汉明码bool judge(){int t = code[2] + code[3] + code[4];if(t %2 != code[5]) return false;t = code[1] + code[3] + code[4];if(t % 2 != code[6]) return false;t = code[1] + code[2] + code[4];if(t % 2 != code[7]) return false;return true;}int main(){int t;while(cin>>t){code[1] = t;  //将输入的第一个数字存入 code[1]for(int i = 2;i <= 7;++i){cin>>code[i];}bool flag = judge();  //判断原始数据是否是汉明码,设立 flag 标志用于循环终止条件判断for(int i = 1;i <= 7 && !flag;++i){code[i] = !code[i];  //取反,0 变成 1 或 1 变成 0flag = judge();   //取反后是否是汉明码if(flag) break;   //是则跳出else code[i] = !code[i];  //不是的话再取反,恢复数据}cout<<code[1];  //注意是数字间带空格for(int i = 2;i <= 7;++i){cout<<' '<<code[i];}cout<<endl;}return 0;}


0 0
原创粉丝点击