UVaOJ 457 - Linear Cellular Automata
AOAPC I: Beginning Algorithm Contests (Rujia Liu) ::Volume 0. Getting Started
Description
40個の培養皿がテーブルの上に並んでいて、中にはある種の菌類が培養されています.
菌類の密度は4種類に分け、0、1、2、3と記す.
菌類には長さ10のDNA配列があり、DNA[k]と表記されている.
このシーケンスは次のように決定されます.
ある日、1つの培養皿中の菌類密度とそれに隣接する培養皿の密度の和はkであった.
翌日、この培養皿中の菌類密度はDNA[k]となる.
現在、40個の培養皿の初期状況は、20個目の培養皿密度が1である以外は0である.
50日前、すべての培養皿の出力を要求します.
出力時に密度(0=',1='.',2='x',3='W')を文字で表す.
Type
English
Analysis
菌類に関する問題は、一般的に英語の問題です.
問題を理解するのは難しいので、理解してから問題の意味に合わせてシミュレーションすればいいです.
注意サンプルは10日前の場合のみ出力され、''は'b'で表される.
具体的にどのように出力するかは、やはりテーマのOutputを基準にします.
Solution
Description
40個の培養皿がテーブルの上に並んでいて、中にはある種の菌類が培養されています.
菌類の密度は4種類に分け、0、1、2、3と記す.
菌類には長さ10のDNA配列があり、DNA[k]と表記されている.
このシーケンスは次のように決定されます.
ある日、1つの培養皿中の菌類密度とそれに隣接する培養皿の密度の和はkであった.
翌日、この培養皿中の菌類密度はDNA[k]となる.
現在、40個の培養皿の初期状況は、20個目の培養皿密度が1である以外は0である.
50日前、すべての培養皿の出力を要求します.
出力時に密度(0=',1='.',2='x',3='W')を文字で表す.
Type
English
Analysis
菌類に関する問題は、一般的に英語の問題です.
問題を理解するのは難しいので、理解してから問題の意味に合わせてシミュレーションすればいいです.
注意サンプルは10日前の場合のみ出力され、''は'b'で表される.
具体的にどのように出力するかは、やはりテーマのOutputを基準にします.
Solution
// UVaOJ 457
// Linear Cellular Automata
// by A Code Rabbit
#include <cstdio>
#include <cstring>
const char MAP[] = {' ', '.', 'x', 'W'};
int dna[10];
int dish[40];
int main() {
int tot_case;
bool first = true;;
scanf("%d", &tot_case);
while (tot_case--) {
for (int i = 0; i < 10; i++) scanf("%d", &dna[i]);
for (int i = 0; i < 40; i++) dish[i] = 0;
dish[19] = 1;
printf("%s", first ? first = false, "" : "
");
for (int i = 0; i < 50; i++) {
for (int j = 0; j < 40; j++)
printf("%c", MAP[dish[j]]);
printf("
");
int temp[40];
for (int j = 0; j < 40; j++) {
int sum = dish[j];
if (j > 0) sum += dish[j - 1];
if (j < 39) sum += dish[j + 1];
temp[j] = dna[sum];
}
memcpy(dish, temp, sizeof(temp));
}
}
return 0;
}