UVa 457 - Linear Cellular Automata
题目大意:
给定40个培养皿和10个DNS program(10个整数值),DNS program的值为0-3的整数值。
最开始第20个培养皿的密度为1,其他的培养皿的密度为0;第二天的培养皿i的密度计算方式为: k=DNS[i-1] + DNS[i] + DNS[i+1]; 则密度为DNS[k];
其中第一个和最后一个培养皿的最左和最右密度均为0;
输入:
case个数, 然后空行,每个case输入10个DNS program;每个case之间空行隔开;
输出:
输出50天40个培养皿的密度;其中0、1、2、3分别用' ' '.' 'x' 'W';
注意sample output中为了看的方便用b表示了空格,并且只输入了10行;
Sample Input
1
0 1 2 0 1 3 3 2 3 0
Sample Output
bbbbbbbbbbbbbbbbbbb.bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbb.xbx.bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb.bb.bb.bbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbb.........bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbb.xbbbbbbbx.bbbbbbbbbbbbbbb
bbbbbbbbbbbbb.bbxbbbbbxbb.bbbbbbbbbbbbbb
bbbbbbbbbbbb...xxxbbbxxx...bbbbbbbbbbbbb
bbbbbbbbbbb.xb.WW.xbx.WW.bx.bbbbbbbbbbbb
bbbbbbbbbb.bbb.xxWb.bWxx.bbb.bbbbbbbbbbb
思路分析:
假设b[40] 表示从0到39号培养皿的密度;
因为要打印每一天的密度,用a[40]作为临时数组记录用于计算过程;
dns[10] 表示DNS program的数值;
a[i] = dns[ b[i-1] + b[i] + b[i+1]]
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[41],b[41]; void print(); int main() { int dna[10]; int t,i,k,j; cin>>t; while(t--) { for(i=0;i<10;i++) cin>>dna[i]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[19]=1; b[19]=1; print(); for(k=1;k<50;k++) { a[0]=dna[b[0]+b[1]]; for(j=1;j<39;j++) a[j]=dna[b[j]+b[j+1]+b[j-1]]; a[39]=dna[b[39]+b[38]]; memcpy(b,a,sizeof(a)); print(); } if(t>0) cout<<endl; } return 0; } void print() { int i; for(i=0;i<40;i++) switch(b[i]) { case 0:putchar(' ');break; case 1:putchar('.');break; case 2:putchar('x');break; case 3:putchar('W');break; } cout<<endl; }