#include<stdio.h>
#include<eggx.h>
#include<stdlib.h>
#define NX 100
#define NY 100
#define EDGE 4
main()
{
int s[NX+2][NY+2], snew[NX+2][NY+2];
int i,j,k;
int step,rseed;
int n,m;
double p,q,r;
int win;
/* preparation for graphics */
win=gopen(NX*EDGE,NY*EDGE);
window(win,1,1,NX,NY);
gsetbgcolor(win,"white");
layer(win,0,1);
/* input step and rseed */
scanf("%d%d",&step,&rseed);
srandom(rseed);
/* set parameters */
p = 0.5;
q = 0.01;
r = 0;
n = 5;
m = 10;
/* set random initial state */
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
if(random()< q*RAND_MAX) s[i][j]= 1;
else if(random() < (q+r)*RAND_MAX) s[i][j] = n+1;
else s[i][j] = 0;
}}
/* transfer boundary */
for(i=1;i<NX+1;++i){
s[i][0] = s[i][NY];
s[i][NY+1] = s[i][1];
}
for(j=0;j<NY+2;++j){
s[0][j] = s[NX][j];
s[NX+1][j] = s[1][j];
}
/* display initial state */
gclr(win);
newcolor(win, "red");
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
if(s[i][j] >= 1 && s[i][j] <=n)fillrect(win,i,j,1,1);}}
newcolor(win, "green");
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
if(s[i][j] >= n+1 && s[i][j] <=n+m) fillrect(win,i,j,1,1);}}
copylayer(win,1,0);
for(k=0; k<step; ++k){
/* start one step */
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
/* one site */
if(s[i][j] >= 1)snew[i][j] = (s[i][j]+1)%(n+m+1);
else if((s[i-1][j-1] >= 1 && s[i-1][j-1] <= n) ||
(s[i-1][j] >= 1 && s[i-1][j] <= n) ||
(s[i-1][j+1] >= 1 && s[i-1][j+1] <= n) ||
(s[i][j-1] >= 1 && s[i][j-1] <= n) ||
(s[i][j+1] >= 1 && s[i][j+1] <= n) ||
(s[i+1][j-1] >= 1 && s[i+1][j-1] <= n) ||
(s[i+1][j] >= 1 && s[i+1][j] <= n) ||
(s[i+1][j+1] >= 1 && s[i+1][j+1] <= n))
{ if(random() < p*RAND_MAX) snew[i][j] = 1;}
}}
/* transfer snew[][] to s[][] */
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j)s[i][j] = snew[i][j];
}
/* transfer boundary */
for(i=1;i<NX+1;++i){
s[i][0] = s[i][NY];
s[i][NY+1] = s[i][1];
}
for(j=0;j<NY+2;++j){
s[0][j] = s[NX][j];
s[NX+1][j] = s[1][j];
}
/* display one step */
gclr(win);
newcolor(win, "red");
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
if(s[i][j] >= 1 && s[i][j] <=n)fillrect(win,i,j,1,1);}}
newcolor(win, "green");
for(i=1;i<NX+1;++i){
for(j=1;j<NY+1;++j){
if(s[i][j] >= n+1 && s[i][j] <=n+m) fillrect(win,i,j,1,1);}}
copylayer(win,1,0);
msleep(10);
/* end of one step */
}
}
|