Okay, so I have tried to write a program that would generate the rule of 110. quoted from wikipedia:

The Rule 110 cellular automaton (often simply Rule 110) is an elementary cellular automaton with the following rule table:
current pattern 111 110 101 100 011 010 001 000
new state for center cell 0 1 1 0 1 1 1 0
In the table above, when the sequence of 1s and 0s corresponding to the new states is regarded as a binary number, the decimal equivalent is 110; hence the name of the rule.

the following is my code:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

int
main()
{
    //set dimensions
    int cols;
    int rows;
    cout<<"how many columns? ";
    cin>>cols;
    cout<<"\nhow many rows? ";
    cin>>rows;
    cout<<"\n";
    int orig[cols];
    int next[cols];
    //set first row with a 1 or 0
    for (int n = 0; n < cols; n++)
    {
        cout<<"Enter the "<<n+1<<"th element(1,0): ";
        int tmp;
        cin>>tmp;
        orig[n] = tmp;
        cout<<"\n";
    }
    for (int m = 0; m < cols; m++) //draw with '*' or ' ' for display's sake
    {
        if (orig[m] == 1)
            cout<<"* ";
        else
            cout<<"  ";
    }
    cout<<"\n";
    int x = 0;
    while(x < rows)//drawing everything else
    {
        int ix;
        for (ix=0; ix < cols; ix++)
        {
            if (ix == 0)//for first element, because there's no element before
            {
                if (orig[ix] == 1 || orig[ix+1] == 1)
                    next[0] = 1;
                else
                    next[0] = 0;
                    orig[ix] = next[ix];
                    if(orig[ix] == 1)
                        cout<<"* ";
                    else
                        cout<<"  ";
                    continue;
            }
            if (ix == cols -1)//for last element, because there's no element afer
            {
                if (orig[ix] == 1)
                    next[cols -1] = 1;
                else
                    next[cols-1] = 0;
                    orig[ix] = next[ix];
                    if(orig[ix] == 1)
                        cout<<"* ";
                    else
                        cout<<"  ";
                    continue;
            }
            //rules
            if (orig[ix-1] == 1 && orig[ix] == 1 && orig[ix+1] == 1)
                next[ix] = 0;
            if (orig[ix-1] == 1 && orig[ix] == 1 && orig[ix+1] == 0)
                next[ix] = 1;
            if (orig[ix-1] == 1 && orig[ix] == 0 && orig[ix+1] == 1)
                next[ix] = 1;
            if (orig[ix-1] == 1 && orig[ix] == 0 && orig[ix+1] == 0)
                next[ix] = 0;
            if (orig[ix-1] == 0 && orig[ix] == 1 && orig[ix+1] == 1)
                next[ix] = 1;
            if (orig[ix-1] == 0 && orig[ix] == 1 && orig[ix+1] == 0)
                next[ix] = 1;
            if (orig[ix-1] == 0 && orig[ix] == 0 && orig[ix+1] == 1)
                next[ix] = 1;
            if (orig[ix-1] == 0 && orig[ix] == 0 && orig[ix+1] == 0)
                next[ix] = 0;
            orig[ix] = next[ix]; //set next as orig
            if(orig[ix] == 1) //draw as '*' or ' '
                cout<<"* ";
            else
                cout<<"  ";
        }
        cout<<"\n";
        x++;
    }
}

when I input cols = 10, rows = 10, and the first line as {0,0,0,0,0,0,0,0,0,1}, I should get a shape that looks like a fractal(http://en.wikipedia.org/wiki/Sierpinski_triangle). instead, some parts of the shape don't generate properly, and I can't tell what's wrong. someone help?

You're replacing your orig[] values as you iterate across your row. You need two loops here, one which computes your next[] values without corrupting your orig[] values, and then another which copies the all of the next[] values back to orig[].

Once you have your code working, you can have fun making it more efficient. How can you avoid doing the copy at all? (Hint: instead of two separately named 1-D arrays, have a 2-D array with 2 rows in it.) Can you think of a way to have only a single 1-D array? (Hint: as you iterate across a row, what's the farthest-left original value you need to maintain?)

Enjoy!

This article has been dead for over six months. Start a new discussion instead.