这是我第一次编写自动机代码,我不确定它是否正常工作。我也有一些问题:
为什么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;
}
答案 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]
多少次?