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