HDU 2526 浪漫手机 (一般错误情况解释+又是一道不错的模拟题+看懂后就是一个水题)【模拟】

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

分析
在这里插入图片描述
首先,我想了解一下,你们第一次看这个图明白它的意思了吗?如果没明白,那么你是找对文章辽!

其实,这个就是对应着你输入的8个模式串(1代表黑色 0代表白色)
比如第①个模式串111 1 黑黑黑 黑 是不是就对应上面图片的第一格
再如第②个模式串110 1 黑黑白 黑 是不是就对应上面图片的第二格


然后最后一行输入的就是第一行字符串,我们第二行的字符串就是通过第一行的字符串得到,
然后题目中也说明了,左右两边默认都是0 那么我们输入的字符都从第1个开始

scanf("%s",mp[1]+1);

简单来说,下一行的字符要看上一行的字符,下一行的第一个字符要看上一行的第0个 第1个 第2个字符组成字符串然后与模式串进行比较 进而确定当前的字符

重重之重,由于字符串默认最后一个字符是’\0’ 所以我们还需要对字符串扩充一位,不然我们下一行最后一个字符就无法判断,然后我们就会输出下面这样的图形,有一部分数据没有匹配到我们的模式串,所以没输出
在这里插入图片描述
AC

#include
#include
#include
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=2000+8;
char mp[maxn][maxn];
struct node{char str[6];char num;
}stu[maxn];
char f(int i,int j)
{for(int k=1;k<=8;k++){if(stu[k].str[0]==mp[i-1][j-1]&&stu[k].str[1]==mp[i-1][j]&&stu[k].str[2]==mp[i-1][j+1]){return stu[k].num;}}
}
int main()
{int t;scanf("%d",&t);while(t--){mst(mp,'0');int m;scanf("%d",&m);for(int i=1;i<=8;i++)scanf("%s %c",stu[i].str,&stu[i].num);getchar();scanf("%s",mp[1]+1);int len=strlen(mp[1]+1);mp[1][len+1]='0';mp[1][len+2]='\0';//cout<for(int i=2;i<=m;i++){for(int j=1;j<=len;j++){mp[i][j]=f(i,j);}mp[i][len+1]='0';mp[i][len+2]='\0';}for(int i=1;i<=m;i++){for(int j=1;j<=len;j++){printf("%c",mp[i][j]);}puts("");}}return 0;
}

学如逆水行舟,不进则退


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部