※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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++;
	}
}