HDU - 2526 - 浪漫手机 (字符串!!)

浪漫手机

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1051    Accepted Submission(s): 469


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

在给定第一行乐谱的情况下,按模式将产生如下乐谱图形:
HDU - 2526 - 浪漫手机 (字符串!!)_第1张图片
我们用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
 

Source
HDU 2008-10 Programming Contest


老感觉我字符串掌握的不太好。。啥KMP,啥扩展KMP都不会。。唉,,做个水题,培养培养代码能力


AC代码(注意m<=1000, 每行乐谱长度<=200,题目也没说,导致我WA了一次。。):

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct node
{
	int col;
	char s[5];
}s1[8];

int a[1050][305];

int fun(int a[][305], int i, int j)
{
	for(int k=0; k<8; k++)
	{
		if(s1[k].s[0]-'0' == a[i][j-1] && s1[k].s[1]-'0' == a[i][j] && s1[k].s[2]-'0' == a[i][j+1]) return s1[k].col;
	}
}

int main()
{
	int t, m;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d", &m);
		for(int i=0; i<8; i++)
			scanf("%s %d", s1[i].s, &s1[i].col);
		getchar();
		memset(a, 0, sizeof(a));
		int count = 1;
		while(1)
		{
			char c = getchar();
			if(c == '\n') break;
			a[1][count++] = c - '0';
		}
		for(int i=1; i<m; i++)
		{
			for(int j=1; j<count; j++)
			{
				a[i+1][j] = fun(a, i, j);
			}
		}
		for(int i=1; i<=m; i++)
		{
			for(int j=1; j<count; j++)
			{
				printf("%d", a[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}


你可能感兴趣的:(字符串,ACM,杂题)