「AOJ1510~1519」の編集履歴(バックアップ)一覧はこちら

AOJ1510~1519」(2013/03/31 (日) 01:59:58) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*1510 Independent Research http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1510 3次元セルオートマトンの初期データと変化ルールが与えられるので一定ターン経過後の状態を出力せよという問題。 解法 一番のりで解いた問題。 周囲27マスの状態を関数で取得すれば計算が簡単になります。 サイズが小さい問題なので何も考えることなく素朴に解きました。 大きなサイズになるとビット演算とか色々使うと思います。 #include<stdio.h> #include<string.h> int map[8][8][8]; int cellCount(int x,int y,int z){ int count=0; for(int i=-1;i<=1;i++){ for(int j=-1;j<=1;j++){ for(int k=-1;k<=1;k++){ count+=map[z+i][y+j][x+k]; } } } count-=map[z][y][x]; return count; } void calc(int n,int no){ memset(map,0,sizeof(map)); char row[6]; for(int z=1;z<=5;z++){ for(int y=1;y<=5;y++){ scanf("%s",row); for(int x=1;x<=5;x++){ map[z][y][x]=row[x-1]-'0'; } } } int as[30]={0}; int bs[30]={0}; int m1,m2,a,b; scanf("%d",&m1); for(int i=0;i<m1;i++){ scanf("%d",&a); as[a]=1; } scanf("%d",&m2); for(int i=0;i<m2;i++){ scanf("%d",&b); bs[b]=1; } for(int i=0;i<n;i++){ int next[8][8][8]; memset(next,0,sizeof(next)); for(int z=1;z<=5;z++){ for(int y=1;y<=5;y++){ for(int x=1;x<=5;x++){ int count=cellCount(x,y,z); if(map[z][y][x]==0&&as[count]==1){ next[z][y][x]=1; }else if(map[z][y][x]==1&&bs[count]==1){ next[z][y][x]=1; }else{ next[z][y][x]=0; } } } } memcpy(map,next,sizeof(next)); } printf("Case %d:\n",no); for(int z=1;z<=5;z++){ for(int y=1;y<=5;y++){ for(int x=1;x<=5;x++){ printf("%d",map[z][y][x]); } printf("\n"); } if(z!=5)printf("\n"); } } int main(){ int n,no=1; while(1){ scanf("%d",&n); if(n==0)break; if(no>1)printf("\n"); calc(n,no); no++; } }

表示オプション

横に並べて表示:
変化行の前後のみ表示: