hdu_2526_浪漫手机


 hdu_2526_浪漫手机


Problem Description
最近,WisKey迷上了手机铃声,但是他对音律不是很懂,所以他想着能否用计算机来随机生成铃声。当WisKey写好程序后,发现生成出来的根本不是铃声,而是噪声!
之后WisKey查阅了一些乐谱发现,其实很多铃声是以某种规律变化的,这里为了简化这个难题,他以连续3个音符来判断下个音符。
如有模式

在给定第一行乐谱的情况下,按模式将产生如下乐谱图形:

我们用0表示白色格子,用1表示黑色格子。
对于没有连续3个格子的边缘(即没有左边格子或右边格子),我们直接用白色格子代替缺少的那一个格子。
 

Input
第一行有一个整数T,代表有T组数据。
每组数据有一个整数M,表示要输出M行乐谱。接着有8行模式串,左边是音符模式,右边是下一个音符。最后一行是第一行乐谱。
 

Output
输出M行,表示M行乐谱。
 

Sample Input
  
  
1 16 111 1 110 1 101 1 100 1 011 1 010 0 001 1 000 0 0000000000000001000000000000000
 

Sample Output
  
  
0000000000000001000000000000000 0000000000000010100000000000000 0000000000000101010000000000000 0000000000001010101000000000000 0000000000010101010100000000000 0000000000101010101010000000000 0000000001010101010101000000000 0000000010101010101010100000000 0000000101010101010101010000000 0000001010101010101010101000000 0000010101010101010101010100000 0000101010101010101010101010000 0001010101010101010101010101000 0010101010101010101010101010100 0101010101010101010101010101010 1010101010101010101010101010101 这题不难,就是上一行的三个字符决定下一行三个中间的字符。关键在于把三个字符换成数字0~7。剩下的要敲出来只是时间问题。 所以定义一个hash函数转换。 贴代码:
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char ch0[1005],ch1[1005];
int hash (char ch[4])                    //hash函数,用于转换。例 字符串  “101”  ->  数字 5 
{
    return ((ch[0]-'0')*4+(ch[1]-'0')*2+(ch[2]-'0'));
}
int main()
{
    int t,m;
    char Type[4],type,mode[8];
    //freopen("a.txt","w",stdin);
    scanf ("%d",&t);
    //printf ("%d",t);
    while(t--)
    {

        scanf ("%d",&m);//printf ("%d\n",m);
        getchar();
        for (int i=0;i<8;i++)
        {
            scanf ("%s %c",Type,&type);
            //printf ("%d ",hash(Type));
            mode[hash(Type)]=type;getchar();
            //printf("%d\n",mode[hash(Type)]);printf ("1 ");
        }//
        scanf ("%s",ch0);
        printf ("%s\n",ch0);
        int len=strlen(ch0);
        for (int i=0;i<m-1;i++)
        {
            for (int j=0;j<len;j++)
            {
                if (j==0) {Type[0]='0';Type[1]=ch0[j];Type[2]=ch0[j+1];}
                else if (j==len-1) {Type[0]=ch0[j-1];Type[1]=ch0[j];Type[2]='0';}
                else {Type[0]=ch0[j-1];Type[1]=ch0[j];Type[2]=ch0[j+1];}
                ch1[j]=mode[hash(Type)];
            }
            for (int j=0;j<len;j++)
            {
                printf ("%c",ch1[j]);
                ch0[j]=ch1[j];
                ch1[j]=0;
            }
            //printf ("%s\n",ch1);
            printf ("\n");
            //strcpy(ch0,ch1);
        }
    }
    return 0;
}


老实说我敲了好久的,要细心点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值