UVa - 457 - Linear Cellular Automata 题解

本题大概题意:

给出一个数组DNA,包含10个数值,如:DNA[10] = {0,1,2,3,,1,2,3,0,1,2}所有数值应该不大于3.

给出一行40个字符的字符串: 空格代表0, '.'代表1,'x'代表2,'W'代表3。 相邻三个数值(或两个数值)相加得到的数作为DNA的下标,然后取DNA数组改下标的数值为新的值。产生新的字符串。

好难说清楚,看原文吧,的确是很难理解的题目:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=398


下列程序仅供参考,带比较复杂的输入输出处理,也许不太适合初学者。达到0.015s速度,没能上排名。网站排名的都有0.000s的,不过是很久的数据了, 大概更新了。

class LinearCellularAutomata
{
	const static int MAX_B = 5120;
	const static int FLASH_P = MAX_B - 45;
	int ist, ost, len;
	char inBuf[MAX_B];
	char outBuf[MAX_B];
	const static int DISHES = 40;
	int DNA[10];

	char getFromBuf()
	{
		if (ist >= len)
		{
			len = fread(inBuf, sizeof(char), MAX_B, stdin);
			ist = 0;
		}
		return inBuf[ist++];
	}

	int intFromBuf()
	{
		char c = getFromBuf();
		while (c < '0' || '9' < c)
		{
			c = getFromBuf();
		}
		int num = 0;
		while ('0' <= c && c <= '9' && len)
		{
			num = (num<<1) + (num<<3) + (c - '0');
			c = getFromBuf();
		}
		return num;
	}

	void wrToBuf(const char *p)
	{
		if (ost > FLASH_P)
		{
			fwrite(outBuf, sizeof(char), ost, stdout);
			ost = 0;
		}
		while (*p)
		{
			outBuf[ost++] = *p;
			p++;
		}
	}

	inline void flashLeft()
	{
		if (ost) fwrite(outBuf, sizeof(char), ost, stdout);
	}

	int cToInt(char a)
	{
		if (' ' == a) return 0;
		if ('.' == a) return 1;
		if ('x' == a) return 2;
		return 3;
	}
	char iToChar(int i)
	{
		if (0 == i) return ' ';
		if (1 == i) return '.';
		if (2 == i) return 'x';
		return 'W';
	}

	void bacterialColonies(char *dishes)
	{
		for (int r = 1; r < 50; r++)
		{
			int last = 0;
			for (int i = 0; i < DISHES; i++)
			{
				int k = cToInt(dishes[i]);
				int cur = k;

				if (0 == i)
					k += cToInt(dishes[i+1]);
				else if (i+1 == DISHES)
					k += last;
				else 
					k += last + cToInt(dishes[i+1]);

				last = DNA[k];
				dishes[i] = iToChar(last);
				last = cur;
			}
			wrToBuf(dishes);
		}		
	}
public:
	LinearCellularAutomata():ist(0), ost(0), len(0)
	{
		int testCases = 0;		

		testCases = intFromBuf();
		while (testCases--)
		{
			for (int i = 0; i < 10; i++)
			{
				DNA[i] = intFromBuf();
			}

			//初始化
			char firLine[DISHES+2];
			for (int i = 0; i < DISHES; i++)
			{
				firLine[i] = ' ';
			}
			firLine[19] = '.';
			firLine[40] = '\n';
			firLine[41] = '\0';

			wrToBuf(firLine);
			char *dishes = firLine;//这里dishes和firLine都是操作同一份数据
			bacterialColonies(dishes);
			if (testCases) wrToBuf("\n\0");
		}
		flashLeft();
	}
};



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值