/*************************/ /* 砂山モデル */ /* 2000.01.26 */ /* By Y. I. */ /*************************/ #include <stdio.h> #include <stdlib.h> #define RC 2147483647.0 /* 乱数の最大値 */ #define N 500 /* 系の最大サイズ */ #define M 10000 /* 雪崩の最大サイズ */ int addsand(int n, int ix, int iy, int s[N][N], int t[]) { int ab=0; /* 雪崩回数をリセット */ s[ix][iy]++; /* 桝目の数字を+1 */ if(s[ix][iy] == 4) /* 数字が4の場合 */ { s[ix][iy]=0; /* 桝目をリセット */ if(ix>0) ab+=addsand(n,ix-1,iy,s,t); /* 左隣に+1 */ if(ix+1<n) ab+=addsand(n,ix+1,iy,s,t); /* 右隣に+1 */ if(iy>0) ab+=addsand(n,ix,iy-1,s,t); /* 下隣に+1 */ if(iy+1<n) ab+=addsand(n,ix,iy+1,s,t); /* 上隣に+1 */ ab++; /* 雪崩のサイズ+1 */ } return(ab); /* 雪崩のサイズを返す */ } int main(void) { int s[N][N], t[M]; int n, last; int ix, iy, it, a; for(ix=0;ix<M;ix++) t[ix]=0; /* 変数のクリア */ for(ix=0;ix<N;ix++) for(iy=0;iy<N;iy++) s[ix][iy]=0; fprintf(stderr, "Size = "); scanf("%d", &n); /* 系のサイズの設定 */ if(n > N) exit(1); /* 最大値を越えていたら中止 */ fprintf(stderr,"Iteration = "); scanf("%d", &last); /* 全回数の数の設定 */ for(it=0;it<last;it++) /* 全回数だけループ開始 */ { ix=(int)(n*random()/RC); /* 乱数により砂を落す桝目を決定 */ iy=(int)(n*random()/RC); /* 乱数により砂を落す桝目を決定 */ a = addsand(n,ix,iy,s,t) -1 ; /* 発生した雪崩のサイズ */ if(a>=0 && a<M) t[a]++; /* 雪崩サイズが1以上なら記録 */ } for(ix=0;ix<M;ix++) printf("%d %d\n",ix+1,t[ix]); /* 雪崩サイズの出力 */ }