Problem Description
最近,WisKey迷上了手机铃声,但是他对音律不是很懂,所以他想着能否用计算机来随机生成铃声。当WisKey写好程序后,发现生成出来的根本不是铃声,而是噪声!
之后WisKey查阅了一些乐谱发现,其实很多铃声是以某种规律变化的,这里为了简化这个难题,他以连续3个音符来判断下个音符。
如有模式
在给定第一行乐谱的情况下,按模式将产生如下乐谱图形:
我们用0表示白色格子,用1表示黑色格子。
对于没有连续3个格子的边缘(即没有左边格子或右边格子),我们直接用白色格子代替缺少的那一个格子。
之后WisKey查阅了一些乐谱发现,其实很多铃声是以某种规律变化的,这里为了简化这个难题,他以连续3个音符来判断下个音符。
如有模式
在给定第一行乐谱的情况下,按模式将产生如下乐谱图形:
我们用0表示白色格子,用1表示黑色格子。
对于没有连续3个格子的边缘(即没有左边格子或右边格子),我们直接用白色格子代替缺少的那一个格子。
Input
第一行有一个整数T,代表有T组数据。
每组数据有一个整数M,表示要输出M行乐谱。接着有8行模式串,左边是音符模式,右边是下一个音符。最后一行是第一行乐谱。
每组数据有一个整数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
一开始压根没看懂题意,擦
看懂了其实挺水
#include <iostream>
#include <string>
using namespace std;
char mod[10]; // 音符变化数组
int main()
{
int T;
cin>>T;
while(T--)
{
int M,i,j,k;
string s,temp;
char next;
cin>>M;
for(i=0;i<8;i++) // 8种推出模式
{
int sum=0;
cin>>temp;
cin>>next;
for(j=0;j<3;j++) //转成2进制节约空间
{
sum=sum*2+(temp[j]-'0');
}
mod[sum]=next; // 每一种情况代表一个音符
}
cin>>s;
cout<<s<<endl; // 第一行
string nexts(s.length(),'0'); // nexts代表下一行要输出的音符
for(j=1;j<M;j++) // 剩下的只要输出M-1行
{
for(i=0;i<s.length();i++)
{
if(i==0) // 左边界
{
nexts[i]=mod[(s[i]-'0')*2+(s[i+1]-'0')];
continue;
}
if(i==s.length()-1) //右边界
{
nexts[i]=mod[(s[i-1]-'0')*4+(s[i]-'0')*2];
continue;
} //中间情况
nexts[i]=mod[(s[i-1]-'0')*4+(s[i]-'0')*2+(s[i+1]-'0')];
}
s=nexts;
cout<<s<<endl;
for(k=0;k<nexts.length();k++)
nexts[k]='0';
}
}
}