MiYu原创, 转帖请注明 : 转载自 ______________白白の屋
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2526
题目描述:
浪漫手机
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 362 Accepted Submission(s): 150
之后WisKey查阅了一些乐谱发现,其实很多铃声是以某种规律变化的,这里为了简化这个难题,他以连续3个音符来判断下个音符。
如有模式
在给定第一行乐谱的情况下,按模式将产生如下乐谱图形:
我们用0表示白色格子,用1表示黑色格子。
对于没有连续3个格子的边缘(即没有左边格子或右边格子),我们直接用白色格子代替缺少的那一个格子。
每组数据有一个整数M,表示要输出M行乐谱。接着有8行模式串,左边是音符模式,右边是下一个音符。最后一行是第一行乐谱。
题目分析 :
纯水 模拟题.......... 就是 由 上面 3 个 格子的 颜色 推出下面 中间那块的 颜色. 推出来直接输出就可以了 .
题目开始已经给出了第一行的 颜色 , 下面的可以直接 暴力推出来 用hash很快就能判断.
代码如下 :
/*
Coded By : MiYu
Link : http://www.cnblogs.com/MiYu || http://www.cppblog.com/MiYu
Author By : MiYu
Test : 1
Program : 2526
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char c[2][50];
int T,t,M;
int main(){
char a[3],b[9];
for(int i=0;i<2;i++) c[i][0]='0';
scanf("%d",&T);
while(T--){
scanf("%d",&M);
for(int i=1;i<=8;i++){
scanf("%s",a);
int num=(a[0]-'0')*4+(a[1]-'0')*2+a[2]-'0';
scanf("%d",&t);
b[num] = '0' + t;
}
scanf("%s",&c[0][1]);
int len=strlen(&c[0][1]);
for(int i=0;i<2;i++) c[i][len+1]='0';
for(int j=0;j<M;j++){
for(int i=0;i<len;i++){
int num=(c[j%2][i]-'0')*4+(c[j%2][i+1]-'0')*2+c[j%2][i+2]-'0';
c[(j+1)%2][i+1]=b[num];
printf("%c",c[j%2][i+1]);
}
printf("\n");
}
}
return 0;
}