C中的元胞自动机

时间:2017-04-26 19:16:51

标签: c

这是我第一次编写自动机代码,我不确定它是否正常工作。我也有一些问题:
为什么newF函数有时返回5?我指定了0和1的所有可能组合,所以它不应该只返回0和1吗? - 在运行代码之后,为什么它在左侧切得很好,在右边不太好? 规则:http://natureofcode.com/book/imgs/chapter07/ch07_14.png

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define size 50
int newF(int, int, int);
void arprnt(int a[], int);
void arev(int a[], int b[], int s);
int test(int a[], int);

int main()
{
    srand(time(NULL));

    int tab[size], ew[size];

    int i, num=0;

    for(i=0; i<size; ++i)
    {
        tab[i] = rand()%2;
        printf("%d", tab[i]);
    }


    int stan = 0;

    while(1)
    {

        if(stan)
        {
            arev(ew, tab, size);
            arprnt(tab, size);
            stan = !stan;
            num = test(ew, size);
            if(!num)
            {
                return 0;
            }

        }
        else
        {
            arev(tab, ew, size);
            arprnt(ew, size);
            stan = !stan;
            num = test(tab, size);
            if(!num)
            {
                return 0;
            }
        }


    }



    return 0;
}

int newF(int a, int b, int c)
{
    if(a==0 && b==0 && c==0)
    {
        return 0;
    }

    if(a==1 && b==1 && c==1)
    {
        return 0;
    }

    if(a == 1)
    {
        if(b == 1)
        {
            if(c == 0)
            {
                return 1;
            }
        }
        else if(b == 0)
        {
            if(c == 1)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }
    else if(a == 0)
    {
        if(b == 1)
        {
            if(c == 1)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            if(c == 1)
            {
                return 1;
            }
        }
    }

    return 5;
}

void arprnt(int a[], int b)
{
    int i;
    printf("\n");
    for(i=0; i<b; ++i)
    {
        if(a[i] == 5 || a[i] == 1)   // (a[i] == 5 || a[i] == 1) to print only zeros
        {
            printf(" ");
        }
        else
        {
            printf("%d", a[i]);
        }
    }
}

void arev(int a[], int b[], int s)
{
    int i;
    for(i=0; i<s; ++i)
    {
        if(i == 0)
        {
            b[i] = newF(a[size-1], a[0], a[1]);
        }
        if(i == s-1)
        {
            b[i] = newF(a[size-2], a[size-1], a[0]);
        }
        b[i] = newF(a[i-1], a[i], a[i+1]);
    }
}

int test(int a[], int c)
{
    int i, num=0;
    for(i=1; i<c; ++i)
            {
                if(a[0] != a[i])
                {
                    num++;
                }
            }
    return num;
}

1 个答案:

答案 0 :(得分:1)

第一次运行function pattern_1(selector) { // code code code window.addEventListener("load", function () { // Etc etc, more code follows... }); } function pattern_2(selector) { // code code code window.addEventListener("load", function () { // Etc etc, more code follows... }); } pattern_1(...); pattern_2(...); 时,最后一个元素变为'5'。这表明您没有正确处理边界条件。

线索:arev时你要分配给b[i]多少次?