UVaOJ 457 - Linear Cellular Automata

1787 ワード

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
// 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; }