HDU——2707 Steganography

题意:解密,通过记录单词之间的空格个数先转化为二进制(空格个数为偶数时标记为1,奇数时为0),然后将二进制的每5位转换为十进制,然后对应所给的规则表输出相应的字符,每次的输入遇到“*”时表示输入结束,遇到“#“时表示整个输入结束。

解题思路:枚举,详见代码。

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int bit[5005],shu[5005];
int cnt = 0,firstc = 0,flag = 0;

void put(int n)//将数值与所代表的字符对应起来
{
   if(n == 0) printf(" ");
   else if(n == 27) printf("'");
   else if(n == 28) printf(",");
   else if(n == 29) printf("-");
   else if(n == 30) printf(".");
   else if(n == 31) printf("?");
   else printf("%c",n-1+'A');
}

void translate(int n)//进制转换函数
{
    int k = 0;
    for(int i = 0; i<n; i++)//将原来的各个位的数值取反以满足题目要求
    bit[i] = !bit[i];
    if(n%5) n = n-n%5+5;//判断字符长度n是否为5的倍数,若不为,则在最后面添0
    for(int i = 4; i<n; i+=5,k++)//k用来记录有多少位十进制数
    {
        int ans = 0,jz=1;//ans用来接收每5位二进制数转换后的十进制数值,jz用来乘2的
        for(int j = i; j>=i-4; j--)
        {
            if(bit[j] == 1) ans+=jz;//当某位的值为1时,就将加上jz
            jz*=2;
        }
        shu[k]=ans;//将每次的转换至存进数组里
    }
    int i = 0;
    while(shu[i] == 0) i++;//将数组开头的0去掉
    while(shu[k-1] == 0) k--;//将数组后面的0去掉
    for(int j = i; j<k; j++) put(shu[j]);//调用put函数输出最后结果
}

void input(char c)
{
    if(c == '*')//如果输入的字符为*就调用translate函数
    {
        translate(cnt+1),cout<<endl;
        cnt=firstc=flag=0,memset(bit,0,sizeof(bit));并将数组bit、cnt、firstc、flag初始化
    }
    if(c==' ')
    {
        if(firstc) cnt++;//firstc用来控制是否是进行新位置的空格计数
        bit[cnt]=!bit[cnt];//空格个数为奇数时用1表示,偶数用0表示
        firstc = 0,flag = 1;//每次计数后将firstc与flag分别重新赋值为0,1
    }
    else if(flag)//flag用来标记输入的是否为第一次空格计数,第一次时为0,其余全部标记为1
    firstc = 1;
}

int main()
{
    char c;
    while((c=getchar())!='#') input(c);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值