Problem:
Problem B: Independent Research
Problem
僕は夏休みの自由研究のテーマとして、生き物観察を選択し、生き物観察キットを購入した。
この生き物は3次元グリッド状の空間を好んで生息する。
各セルには最大1匹までしか入れない。
周囲の環境に合わせ1日が経過するごとに誕生と死滅を繰り返す。
誕生と死滅の条件は、セルに隣接する生き物の数に依存する。
ここで、あるセルに生き物が隣接するとは、あるセルと生き物が生息しているもう一つのセルが面、辺、または点を共有していることを言う。
誕生と死滅のルールは次のようになる。
生き物が生息していないセルにおいて、隣接する生き物の数が
a
i
(1 ≤
i
≤
M
1
) 匹であるような
i
がある場合、そのセルに生き物が誕生する。
生き物が生息しているセルにおいて、隣接する生き物の数が
b
j
(1 ≤
j
≤
M
2
) 匹であるような
j
がない場合、そのセルの生き物は死滅する。
今回購入した飼育箱はセルの数が5*5*5である立方体の飼育箱だ。
この飼育箱ではこの生き物はどのような振る舞いをするのだろうか…？　とても楽しみである。
〜数日後〜
とりあえず、飼育してみたが…　

毎日観察するなんて時間がかかるし、僕にはめんどくさくてやる気がおきない。

そうだ、コンピューターとプログラムを使ってシミュレートしよう。
Input
入力は複数のデータセットからなる。
各データセットは以下のフォーマットで与えられる。
N
(
z
= 0 の飼育箱の状態)
(空行)
(
z
= 1 の飼育箱の状態)
(空行)
(
z
= 2 の飼育箱の状態)
(空行)
(
z
= 3 の飼育箱の状態)
(空行)
(
z
= 4 の飼育箱の状態)
(空行)
M
1
a
1
a
2
…
a
M
1
M
2
b
1
b
2
…
b
M
2
最初にシミュレートする日数
N
が与えられる。
次に飼育箱の初期状態の情報が与えられる。これは5つの5*5の2次元グリッドで与えられる。
各2次元グリッドは0と1から成り立ち、1は生き物がいることを示し、0は何もいないことを示す。
例えば、
z
= 0のセルの状態の2次元グリッドの4行2列目の値が1だった場合、飼育箱の座標(1, 3, 0)の位置に生き物がいることを表す。
次に、整数
M
1
が与えられ、そのあとに
M
1
個の数字
a
i
が与えられる。
次に、整数
M
2
が与えられ、そのあとに
M
2
個の数字
b
j
が与えられる。
入力の終わりは
N
= 0で表される。
Constraints
入力は以下の条件を満たす。
1 ≤
N
≤ 100
0 ≤
M
1
,
M
2
≤ 27
0 ≤
a
i
,
b
j
≤ 26 
(1 ≤
i
≤
M
1
, 1 ≤
j
≤
M
2
)
任意の
i
,
j
(1 ≤
i
<
j
≤
M
1
) 
において、
a
i
≠
a
j
任意の
i
,
j
(1 ≤
i
<
j
≤
M
2
) 
において、
b
i
≠
b
j
Output
各データセットに対し、
N
日経過後の状態を出力せよ。
出力は以下のフォーマットに従う。
Case (テストケースの番号):
(
z
= 0 の飼育箱の状態)
(空行)
(
z
= 1 の飼育箱の状態)
(空行)
(
z
= 2 の飼育箱の状態)
(空行)
(
z
= 3 の飼育箱の状態)
(空行)
(
z
= 4 の飼育箱の状態)
1行目にテストケース番号を出力し、次の行から
N
日経過後の状態として、5*5の2次元グリッドを5つ出力せよ。
各テストケースの出力間には空行を出力しなさい。
Sample Input
5
00000
01010
00000
00100
00000

00000
01010
00000
01010
00000

00000
00100
00000
01010
00000

00000
01010
00000
00100
00000

00000
00000
00100
00000
00000

1 2
2 3 4
4
01110
00100
00100
00100
01110

01110
10001
10000
10001
01110

11111
10001
11111
10000
10000

01110
10001
10000
10001
01110

00000
00000
00000
00000
00000

2 3 4
1 2
100
00100
01010
01110
10001
10001

01110
00100
00100
00100
01110

00000
00000
00000
00000
00000

11111
00010
00100
01000
11111

10001
10001
10001
10001
01110

5 1 3 5 7 9
5 0 2 4 6 8
0
Sample Output
Case 1:
00000
00000
01010
01110
10101

00000
10001
00000
00000
00000

00000
00000
11111
10001
00000

00000
00000
00000
00000
01010

00000
00000
01110
00100
11111

Case 2:
00010
10110
00000
11000
10000

00001
00000
10101
00010
00100

10001
00000
00000
00000
00010

01110
10001
00000
00001
10000

00000
00000
00111
01001
01000

Case 3:
00000
00000
00000
00000
00000

00000
00000
00000
00000
00000

00000
00000
00000
00000
00000

00000
00000
00000
00000
00000

00000
00000
00000
00000
00000

Submitted solutions:

code_snippet: #include<bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;

int f[2][5][5][5], m1, a[27], m2, b[27];
int main() {
	int n, cnt = 1;
	while (scanf("%d", &n), n) {
		if (cnt != 1)printf("\n");
		rep(i, 5)rep(j, 5)rep(k, 5)scanf("%1d", &f[0][i][j][k]);
		scanf("%d", &m1); rep(i, m1)scanf("%d", &a[i]);
		scanf("%d", &m2); rep(i, m2)scanf("%d", &b[i]);
		rep(i, n) {
			int t = i & 1;
			rep(x, 5)rep(y, 5)rep(z, 5) {
				int cnt = 0;
				for (int j = -1; j <= 1; j++)
					for (int k = -1; k <= 1; k++)
						for (int l = -1; l <= 1; l++) {
							if (j == 0 && k == 0 && l == 0)continue;
							int nx = x + j, ny = y + k, nz = z + l;
							if (0 <= nx&&nx < 5 && 0 <= ny&&ny < 5 && 0 <= nz&&nz < 5 && f[t][nx][ny][nz])cnt++;
						}
				if (f[t][x][y][z]) {
					if (find(b, b + m2, cnt) == b + m2)f[!t][x][y][z] = 0;
					else f[!t][x][y][z] = 1;
				}
				else {
					if (find(a, a + m1, cnt) != a + m1)f[!t][x][y][z] = 1;
					else f[!t][x][y][z] = 0;
				}
			}
		}
		printf("Case %d:\n", cnt);
		rep(i, 5) {
			rep(j, 5) {
				rep(k, 5)printf("%d", f[n & 1][i][j][k]);
				printf("\n");
			}
			if (i < 4)printf("\n");
		}
		cnt++;
	}
}
accuracy: 1
time_ms: 10
memory_kb: 3192
final_rank: 20

code_snippet: #include <iostream>
#include <string>
#include <vector>
#include <cstdio>

using namespace std;

int main() {
	int n;
	int aa = 1;
	int dx[] = {-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, /*0,*/ 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
	int dy[] = {-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, /*0,*/ 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1};
	int dz[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, /*0,*/ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
	while (cin >> n) {
		if (n == 0) {
			break;
		}
		if (aa != 1) {
			cout << endl;
		}
		int d[5][5][5];
		string s;
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5; j++) {
				cin >> s;
				for (int k = 0; k < 5; k++) {
					d[k][j][i] = s[k]-'0';
				}
			}
		}
		/*for (int i = 0; i < 5; i++) {
			if (i != 0) {
				cout << endl;
			} else {
				printf("Case %d:\n", aa);
			}
			for (int j = 0; j < 5; j++) {
				for (int k = 0; k < 5; k++) {
					cout << d[k][j][i];
				}
				cout << endl;
			}
		}
		/*cout << 'a' << endl;*/
		int m1, m2;
		cin >> m1;
		vector<int> a(m1);
		for (int i = 0; i < m1; i++) {
			cin >> a[i];
		}
		//cout << m1 << endl;
		cin >> m2;
		vector<int> b(m2);
		for (int i = 0; i < m2; i++) {
			cin >> b[i];
		}
		//cout << m2 << endl;
		for (int i = 0; i < n; i++) {
			int d2[5][5][5];
			for (int x = 0; x < 5; x++) {
				for (int y = 0; y < 5; y++) {
					for (int z = 0; z < 5; z++) {
						int ccc = 0;
						for (int j = 0; j < 26; j++) {
							if (0 <= x+dx[j] && x+dx[j] < 5 && 0 <= y+dy[j] && y+dy[j] < 5 && 0 <= z+dz[j] && z+dz[j] < 5) {
								ccc +=d[x+dx[j]][y+dy[j]][z+dz[j]];
							}
						}
						d2[x][y][z] = 0;
						if (d[x][y][z] == 0) {
							for (int j = 0; j < m1; j++) {
								if (ccc == a[j]) {
									d2[x][y][z] = 1;
									break;
								}
							}
						} else {
							for (int j = 0; j < m2; j++) {
								if (ccc == b[j]) {
									d2[x][y][z] = 1;
									break;
								}
							}
						}
					}
				}
			}
			for (int x = 0; x < 5; x++) {
				for (int y = 0; y < 5; y++) {
					for (int z = 0; z < 5; z++) {
						d[x][y][z] = d2[x][y][z];
					}
				}
			}
		}
		for (int i = 0; i < 5; i++) {
			if (i != 0) {
				cout << endl;
			} else {
				printf("Case %d:\n", aa);
			}
			for (int j = 0; j < 5; j++) {
				for (int k = 0; k < 5; k++) {
					cout << d[k][j][i];
				}
				cout << endl;
			}
		}
		aa++;
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1236
final_rank: 15

code_snippet: #include<bits/stdc++.h>
#define M 27
#define N 5
using namespace std;
int n,c[2][N][N][N],m1,m2,a[M],b[M],num=1;

int Count(int x,int y,int z,int t){
  int d[3]={-1,0,1},res=0;
  for(int i=0;i<3;i++)
    for(int j=0;j<3;j++)
      for(int k=0;k<3;k++){
	int nx=x+d[i],ny=y+d[j],nz=z+d[k];
	if(!d[i]&&i==j&&j==k)continue;
	if(nx<0||ny<0||nz<0)continue;
	if(N<=nx||N<=ny||N<=nz)continue;
	if(c[t][nx][ny][nz])res++;
      }
  return res;
}

int main(){
  while(1){
    cin>>n;
    if(!n)break;
    if(num>=2)cout<<endl;
    cout<<"Case "<<num<<':'<<endl;
    string s;
    for(int i=0;i<N;i++)
      for(int j=0;j<N;j++){
	cin>>s;
	for(int k=0;k<N;k++){
	  c[0][i][j][k]=s[k]-'0';
	}
      }
    cin>>m1;
    for(int i=0;i<m1;i++)cin>>a[i];
    cin>>m2;
    for(int i=0;i<m2;i++)cin>>b[i];
    for(int l=0;l<n;l++){
      int idx=l%2;
      for(int i=0;i<N;i++)
	for(int j=0;j<N;j++){
	  for(int k=0;k<N;k++){
	    int r=Count(i,j,k,idx),f=0;
	    if(!c[idx][i][j][k]){
	      for(int p=0;p<m1;p++)
		if(r==a[p])f=1;
	      if(f)c[!idx][i][j][k]=1;
	      else c[!idx][i][j][k]=0;
	    }else{
	      for(int p=0;p<m2;p++)
		if(r==b[p])f=1;
	      if(!f)c[!idx][i][j][k]=0;
	      else c[!idx][i][j][k]=1;
	    }
	  }
	}
    }
    for(int i=0;i<N;i++){
      for(int j=0;j<N;j++){
	for(int k=0;k<N;k++)
	  cout<<c[n%2][i][j][k];
	cout<<endl;
      }
      if(i!=N-1)cout<<endl;
    }
    num++;
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int n, c = 0;
int v[5][5][5], v2[5][5][5];
bool a[30], b[30];

int dx[26] = { 1,-1,	 0, 0,	   0, 0,	 1, 1,-1,-1,	 1, 1,-1,-1,	 0, 0, 0, 0,	 1, 1, 1, 1,	-1,-1,-1,-1};
int dy[26] = { 0, 0,	 1,-1,	   0, 0,	 1,-1, 1,-1,	 0, 0, 0, 0,	 1, 1,-1,-1,	 1, 1,-1,-1,	 1, 1,-1,-1};
int dz[26] = { 0, 0,	 0, 0,	   1,-1,	 0, 0, 0, 0,	 1,-1, 1,-1,	 1,-1, 1,-1,	 1,-1, 1,-1,	 1,-1, 1,-1};

bool can(int x,int y,int z) {
	if(0 <= x && x < 5 && 0 <= y && y < 5 && 0 <= z && z < 5) return true;
	return false;
}

int main() {
	while(cin >> n && n) {
		memset(v, 0, sizeof(v));
		memset(v2, 0, sizeof(v2));

		rep(i, 5) {
			rep(j, 5) {
				string s;
				cin >> s;

				rep(k, 5) {
					v[i][j][k] = s[k] - '0';
				}
			}
		}

		int m1;
		cin >> m1;

		memset(a, 0, sizeof(a));
		rep(i, m1) {
			int x;
			cin >> x;
			a[x] = true;
		}

		int m2;
		cin >> m2;
		memset(b, 0, sizeof(b));
		rep(i, m2) {
			int x;
			cin >> x;
			b[x] = true;
		}

		rep(q, n) {
			rep(i, 5) rep(j, 5) rep(k, 5) v2[i][j][k] = v[i][j][k];
			rep(i, 5) {
				rep(j, 5) {
					rep(k, 5) {
						int sum = 0;

						rep(l, 26) {
							int x = i + dx[l];
							int y = j + dy[l];
							int z = k + dz[l];

							if(can(x, y, z)) sum += v[x][y][z];
						}

						if(v[i][j][k] == 0) {
							if(a[sum]) {
								v2[i][j][k] = 1;
							}
						} else {
							if(!b[sum]) {
								v2[i][j][k] = 0;
							}
						}
					}
				}
			}

			rep(i, 5) rep(j, 5) rep(k, 5) v[i][j][k] = v2[i][j][k];
		}

		if(c) cout << endl;
		cout << "Case " << c + 1 << ":" << endl;
		c++;

		rep(i, 5) {
			if(i) cout << endl;
			rep(j, 5) {
				rep(k, 5) {
					cout << v[i][j][k];
				}
				cout << endl;
			}
		}
	}

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1216
final_rank: 11

code_snippet: #include<bits/stdc++.h>
using namespace std;
int m1,m2;
string mp[5][5],tmp[5][5];
int A[30],B[30];
int n;
 
int Count(int z,int y,int x){
  int res=0;
  for(int i=-1;i<=1;i++)
    for(int j=-1;j<=1;j++){
      int nx=x+j,ny=y+i;
      if(nx<0||ny<0||nx>=5||ny>=5) continue;
      if((i!=0||j!=0)&&(mp[z][ny][nx])=='1')res++;
      if(z&&mp[z-1][ny][nx]=='1') res++;
      if(z<4&&mp[z+1][ny][nx]=='1')res++;
    }
  return res;
}
 
void solve(){
  while(n--){
    for(int i=0;i<5;i++)for(int j=0;j<5;j++) tmp[i][j]=mp[i][j];
 
    for(int i=0;i<5;i++)
      for(int j=0;j<5;j++)
    for(int k=0;k<5;k++){
      int cnt=Count(i,j,k);
      for(int l=0;l<m1&&mp[i][j][k]=='0';l++) if(cnt==A[l]) tmp[i][j][k]='1';
      int f=(mp[i][j][k]=='1');
      for(int l=0;l<m2&&mp[i][j][k]=='1';l++) if(cnt==B[l]) f=0;
      if(f) tmp[i][j][k]='0';
    }
    for(int i=0;i<5;i++)for(int j=0;j<5;j++) mp[i][j]=tmp[i][j];
  }
}
 
 
int main(){
  int cnt=0;
  while(cin>>n,n){
    cnt++;
    if(cnt!=1)cout <<endl;
    for(int i=0;i<5;i++)
      for(int j=0;j<5;j++) cin>>mp[i][j];
 
    cin>> m1;
    for(int i=0;i<m1;i++) cin>>A[i];
    cin>>m2;
    for(int i=0;i<m2;i++) cin>>B[i];
    solve();
    cout <<"Case "<<cnt<<":"<<endl;
    for(int i=0;i<5;i++){
      for(int j=0;j<5;j++)cout << mp[i][j]<<endl;
      if(i!=4)cout <<endl;
    }
  }
   
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1216
final_rank: 11

code_snippet: #include<bits/stdc++.h>
using namespace std;

#define MAX 26
int  c(int x,int y ,int z);
int check(int x,int y ,int z);

int cell[5][5][5];
int before[5][5][5];
int N,m1,m2;
int a[MAX],b[MAX];

int main(){
  int i,j,k,step;
  int count=1;
  string str;
  cin >> N;
  while(N!=0){
    for(k=0;k<5;k++){
      for(j=0;j<5;j++){
        cin >> str;
        for(i=0;i<5;i++){
          before[i][j][k]=str[i]-'0';
          if(before[i][j][k]>1)
            cout <<i<<j<<k<< endl;
        }
      }
    }
    
    cin >> m1;
    for(i=0;i<m1;i++) cin >> a[i];
    cin >> m2;
    for(i=0;i<m2;i++) cin >> b[i];
    

    for(step=0;step<N;step++){
      for(i=0;i<5;i++){
        for(j=0;j<5;j++){
          for(k=0;k<5;k++){
            cell[i][j][k]=c(i,j,k);
          }
          
        }
      }
      for(i=0;i<5;i++){
        for(j=0;j<5;j++){
          for(k=0;k<5;k++){
            before[i][j][k]=cell[i][j][k];
          }
          
        }
      }
    }
    cout << "Case " << count << ":" << endl;
    for(k=0;k<5;k++){
      for(j=0;j<5;j++){
        for(i=0;i<5;i++){
          cout << cell[i][j][k];
        }
        cout << endl;
      }
      if(k!=4 )cout << endl;
    }
    count++;
    cin >> N;
    if(N!=0) cout << endl;
  }
  
  return 0;

}

int c(int x,int y ,int z){
  int r=0,i,j,k;
  for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      for(k=0;k<3;k++){
        if(!(i==1&&j==1&&k==1)&&check(x-1+i,y-1+j,z-1+k)==1){
          r+=before[x-1+i][y-1+j][z-1+k];
        }
      }
    }
  }
  //  cout << r << endl;
  if(before[x][y][z]==0){
    for(i=0;i<m1;i++){
      if(a[i]==r) return 1;
    }
    return 0;
  }else{
    for(i=0;i<m2;i++){
      if(b[i]==r) return 1;
    }
    return 0;
  }
}

int check(int x,int y ,int z){
  if(x<0||x>4||y<0||y>4||z<0||z>4)  return 0;
  else return 1;
}
accuracy: 1
time_ms: 10
memory_kb: 1208
final_rank: 3

code_snippet: #include <bits/stdc++.h>
using namespace std;

int casenumber = 0;

const int dx[] = {-1, 0, 1};
const int dy[] = {-1, 0, 1};
const int dz[] = {-1, 0, 1};

bool inField(int x, int y, int z){
  return 0 <= x && 0 <= y && 0 <= z && x < 5 && y < 5 && z < 5;
}


int main(void){
  ios::sync_with_stdio(false);
  cin.tie(0);
  int N;
  bool flg = false;
  while(cin >> N, N){
    if(flg) cout << '\n';
    flg = true;
    int M1, M2;
    set<int> m1, m2;
    //int g[5][5][5];
    vector< vector< vector<int> > > g(5, vector< vector<int> >(5, vector<int>(5)));
    for(int i=0; i < 5; i++){
      for(int j=0; j <5; j++){
        string str; cin >> str;
        for(int k=0; k < 5; k++){
          g[i][j][k] = str[k] - '0';
        }
      }
    }
    cin >> M1;
    for(int i=0; i < M1; i++){
      int tmp; cin >> tmp; m1.insert(tmp);
    }
    cin >> M2;
    for(int i=0; i < M2; i++){
      int tmp; cin >> tmp; m2.insert(tmp);
    }

    while(N--){
      vector< vector< vector<int> > > org = g;
      for(int i=0; i < 5; i++){
        for(int j=0; j < 5; j++){
          for(int k=0; k < 5; k++){

            int lvcnt = 0;
            for(int x=0; x < 3; x++){
              for(int y=0; y < 3; y++){
                for(int z=0; z < 3; z++){
                  if(x == 1 && y == 1 && z == 1) continue;
                  int nx = k + dx[x], ny = j + dy[y], nz = i + dz[z];
                  if(!inField(nx, ny, nz)) continue;
                  if(org[nz][ny][nx] == 1){
                    lvcnt++;
                  }
                }
              }
            }
            if(org[i][j][k] == 1){
              if(m2.find(lvcnt) == m2.end()) g[i][j][k] = 0;
            }else{
              if(m1.find(lvcnt) != m1.end()) g[i][j][k] = 1;
            }

          }
        }
      }
    }

    cout << "Case " << ++casenumber << ":" << '\n';
    for(int i=0; i < 5; i++){
      for(int j=0; j < 5; j++){
        for(int k=0; k < 5; k++){
          cout << g[i][j][k];
        }
        cout << '\n';
      }
      if(i < 4)
        cout << '\n';
    }
  }

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1244
final_rank: 18

code_snippet: #include <bits/stdc++.h>

using namespace std;

int N, M1, M2;
char cell[5][5][5];
char cccc[5][5][5];
int a[27], b[27];

int z;

int adj(int x, int y, int z)
{
  int ret = 0;
  for(int dz = -1; dz <= 1; dz++){
    for(int dy = -1; dy <= 1; dy++){
      for(int dx = -1; dx <= 1; dx++){
	if(dz != 0 || dy != 0 || dx != 0){
	  if(0 <= z+dz && z+dz < 5 &&
	     0 <= y+dy && y+dy < 5 &&
	     0 <= x+dx && x+dx < 5){
	    ret += (cccc[z+dz][y+dy][x+dx] == '1');
	  }
	}
      }
    }
  }
  return ret;
}

void dfs(int n)
{
  if(n == 0) return;
  
  for(int i = 0; i < 5; i++){
    for(int j = 0; j < 5; j++){
      for(int k = 0; k < 5; k++){
	cccc[i][j][k] = cell[i][j][k];
      }
    }
  }  
  
  for(int i = 0; i < 5; i++){
    for(int j = 0; j < 5; j++){
      for(int k = 0; k < 5; k++){
	int cre = adj(k, j, i);
	if(cccc[i][j][k] == '0'){
	  for(int l = 0; l < M1; l++){
	    if(cre == a[l]){
	      cell[i][j][k] = '1'; 
	      break;
	    }
	  }
	} else if(cccc[i][j][k] == '1'){
	  bool flag = false;
	  for(int l = 0; l < M2; l++){
	    if(cre == b[l]){
	      flag = true;
	      break;
	    }
	  }
	  if(!flag) cell[i][j][k] = '0';
	}
      }
    }
  }
  
  dfs(n-1);
}

int main()
{
  for(int s = 0; ; s++){
    cin >> N;
    if(N == 0) break;
    if(s > 0) cout << endl;
    for(int i = 0; i < 5; i++){
      for(int j = 0; j < 5; j++){
	for(int k = 0; k < 5; k++){
	  cin >> cell[i][j][k];
	}
      }
    }

    cin >> M1;
    for(int i = 0; i < M1; i++) cin >> a[i];

    cin >> M2;
    for(int i = 0; i < M2; i++) cin >> b[i];
    
    dfs(N);
    
    cout << "Case " << s+1 << ":" << endl;
    for(int i = 0; i < 5; i++){
      if(i > 0) cout << endl;
      for(int j = 0; j < 5; j++){
	for(int k = 0; k < 5; k++){
	  cout << cell[i][j][k];
	}
	cout << endl;
      }
    }
  } 
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1168
final_rank: 2

code_snippet: #include<bits/stdc++.h>
using namespace std;
int m1,m2;
string mp[5][5],tmp[5][5];
int A[30],B[30];
int n;

int Count(int z,int y,int x){
  int res=0;
  for(int i=-1;i<=1;i++)
    for(int j=-1;j<=1;j++){
      int nx=x+j,ny=y+i;
      if(nx<0||ny<0||nx>=5||ny>=5) continue;
      if((i!=0||j!=0)&&(mp[z][ny][nx])=='1')res++;
      if(z&&mp[z-1][ny][nx]=='1') res++;
      if(z<4&&mp[z+1][ny][nx]=='1')res++;
    }
  return res;
}

void solve(){
  while(n--){
    for(int i=0;i<5;i++)for(int j=0;j<5;j++) tmp[i][j]=mp[i][j];

    for(int i=0;i<5;i++)
      for(int j=0;j<5;j++)
	for(int k=0;k<5;k++){
	  int cnt=Count(i,j,k);
	  for(int l=0;l<m1&&mp[i][j][k]=='0';l++) if(cnt==A[l]) tmp[i][j][k]='1';
	  int f=(mp[i][j][k]=='1');
	  for(int l=0;l<m2&&mp[i][j][k]=='1';l++) if(cnt==B[l]) f=0;
	  if(f) tmp[i][j][k]='0';
	}
    for(int i=0;i<5;i++)for(int j=0;j<5;j++) mp[i][j]=tmp[i][j];
  }
}


int main(){
  int cnt=0;
  while(cin>>n,n){
    cnt++;
    if(cnt!=1)cout <<endl;
    for(int i=0;i<5;i++)
      for(int j=0;j<5;j++) cin>>mp[i][j];

    cin>> m1;
    for(int i=0;i<m1;i++) cin>>A[i];
    cin>>m2;
    for(int i=0;i<m2;i++) cin>>B[i];
    solve();
    cout <<"Case "<<cnt<<":"<<endl;
    for(int i=0;i<5;i++){
      for(int j=0;j<5;j++)cout << mp[i][j]<<endl;
      if(i!=4)cout <<endl;
    }
  }
  
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include<iostream>
#include<vector>
#include<string>

using namespace std;

#define EXIST '1'
#define NONE '0'

typedef vector<string> VS;
typedef vector<VS> VVS;
typedef vector<VVS> VVVS;
typedef vector<int> VI;
typedef vector<VI> VVI;

bool check(int x, int y, int z){
	if(x>=5||x<0)return false;
	if(y>=5||y<0)return false;
	if(z>=5||z<0)return false;
	return true;
}

int main(){
	int t = 1;
	while (1){
		int N,M;
		cin >> N;
		if (N == 0)return 0;
		if (t>=2)cout << endl;
		VVVS box(N+1,VVS(5, VS(5,"00000")));

		for (int z = 0; z < 5; z++){
			for (int x = 0; x < 5; x++){
				cin >> box[0][z][x];
			}
		}
		VVI pt(100, VI(27,NONE));
		cin >> M;
		for (int i = 0; i < M; i++){
			int t; cin >> t;
			pt[NONE][t] = EXIST;
		}
		cin >> M;
		for (int i = 0; i < M; i++){
			int t; cin >> t;
			pt[EXIST][t] = EXIST;
		}

		for (int i = 0; i < N; i++){
			for (int z = 0; z < 5; z++)
			for (int x = 0; x < 5; x++)
			for (int y = 0; y < 5; y++){
				int cnt = 0;
				for (int dz = -1; dz <= 1; dz++)
				for (int dx = -1; dx <= 1; dx++)
				for (int dy = -1; dy <= 1; dy++){
					if (dx == 0 && dy == 0 && dz == 0)continue;
					int xx = x + dx;
					int yy = y + dy;
					int zz = z + dz;
					if (check(xx, yy, zz))
					cnt += (box[i][zz][xx][yy] == EXIST);
				}

				box[i + 1][z][x][y] = pt[box[i][z][x][y]][cnt];
			}
		}

		cout << "Case " << t << ":" << endl;
		t++;
		for (int z = 0; z < 5; z++){
			for (int x = 0; x < 5; x++)
				cout << box[N][z][x] << endl;
			if (z != 4)cout << endl;
		}
	}

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1412
final_rank: 19

code_snippet: #include <bits/stdc++.h>
using namespace std;
int n;
int Case=0;
char box[7][7][7];
char tmp[7][7][7];
int live[27];
int death[27];
void copy(){
	for(int x=0;x<7;x++){
		for(int y=0;y<7;y++){
			for(int z=0;z<7;z++){
				tmp[x][y][z]=box[x][y][z];
			}
		}
	}
}
void reset(){
	for(int x=0;x<7;x++){
		for(int y=0;y<7;y++){
			for(int z=0;z<7;z++){
				box[x][y][z]='2';
			}
		}
	}
}
void scan(){
	if(Case>0)cout<<endl;
	cout<<"Case "<<++Case<<":\n";
	for(int z=1;z<=5;z++){
		for(int y=1;y<=5;y++){
			for(int x=1;x<=5;x++){
				cin>>box[x][y][z];
			}
		}
	}
	for(int i=0;i<27;i++)live[i]=death[i]=0;
	int m,k;
	for(cin>>m;m--;){
		cin>>k;
		live[k]=1;
	}
	for(cin>>m;m--;){
		cin>>k;
		death[k]=1;
	}
}

int cnt(int X,int Y,int Z){
	int res=0;
	for(int x=X-1;x<=X+1;x++){
		for(int y=Y-1;y<=Y+1;y++){
			for(int z=Z-1;z<=Z+1;z++){
				if(x==X && y==Y && z==Z)continue;
				if(tmp[x][y][z]=='1')res++;
			}
		}
	}
	return res;
}

void cal(){
	copy();
	for(int x=1;x<=5;x++){
		for(int y=1;y<=5;y++){
			for(int z=1;z<=5;z++){
				int c=cnt(x,y,z);
				if(tmp[x][y][z]=='0'){
					if(live[c])box[x][y][z]='1';
				}
				else{
					if(death[c]==0)box[x][y][z]='0';
				}
				
			}
		}
	}
}
void print(){
	for(int z=1;z<=5;z++){
		if(z>1)cout<<endl;
		for(int y=1;y<=5;y++){
			for(int x=1;x<=5;x++){
				cout<<box[x][y][z];
			}
			cout<<endl;
		}
	}
}

int main(){
	
	while(cin>>n,n){
		reset();
		scan();
		while(n--)cal();
		print();
	}
	
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1164
final_rank: 1

code_snippet: #include<bits/stdc++.h>
 
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
 
using namespace std;
 
bool a[5][5][5][2];
int M1,M2;
int alpha[30], beta[30];
 
inline bool isValid(int x,int y,int z) { return 0 <= x && x < 5 && 0 <= y && y < 5 && 0 <= z && z < 5; }
 
bool ok(bool type,int v){
  if( !type ) rep(i,M1) if( alpha[i] == v ) return true;
  if(  type ) rep(i,M2) if(  beta[i] == v ) return true;
  return false;
}
 
void print(int type){
  rep(z,5) {
    if( z ) puts("");
    rep(y,5) {
      rep(x,5) {
    cout << a[z][y][x][type];
      } puts("");
    }
  }
}
 
int main(){
  int N,CNT=1;
  bool fu = 1;
  while( cin >> N, N ){
    if( !fu ) puts("");
    fu = false;
    rep(z,5) rep(y,5) {
      string s;
      cin >> s;
      rep(x,5) a[z][y][x][0] = (s[x]=='0'?false:true);
    }
 
    //print(0);
 
    cin >> M1; rep(i,M1) cin >> alpha[i];
    cin >> M2; rep(i,M2) cin >> beta[i];
    printf("Case %d:\n",CNT++);
    rep(i,5) rep(j,5) rep(k,5) a[i][j][k][1] = false;
 
    int phase = 0;    
    rep(day,N) { 
      rep(z,5) rep(y,5) rep(x,5) {
    int cur = phase&1;
    int next = (phase+1)&1;
    bool type = a[z][y][x][cur];
    int cnt = 0;
    for(int dz=-1;dz<=1;dz++){
      for(int dy=-1;dy<=1;dy++){
        for(int dx=-1;dx<=1;dx++){
          if( dz == 0 && dy == 0 && dx == 0 ) continue;
          int nz = z + dz, ny = y + dy, nx = x + dx;
          if( !isValid(nx,ny,nz) ) continue;
          bool v = a[nz][ny][nx][cur];
          //cout << "(" << nx << "," << ny << "," << nz << ") " << a[nz][ny][nx][cur] << "!!" << endl;
          if( v ) ++cnt;
          /*
          if( !type &&  v ) ++cnt;
          if(  type && !v ) ++cnt;
          */
        }   
 
      } 
    }
 
    if( !type ) a[z][y][x][next] = ( ok(type,cnt) ) ? true : false;
    if(  type ) a[z][y][x][next] = ( ok(type,cnt) ) ? true : false;
 
      }
      ++phase;
    }
 
    print(phase&1);
 
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1236
final_rank: 15

code_snippet: #include <bits/stdc++.h>

using namespace std;

#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define rep(i,n) REP(i,0,n)

#define ck(x,a,b) (a<=x&&x<b)

inline bool inrange(int x, int y, int z) {
  return ck(x,0,5) && ck(y,0,5) && ck(z,0,5);
}

int main() {
  
  for(int N, Tcnt=1; cin >> N && N; Tcnt++) {
    vector<vector<vector<int> > > curr(5, vector<vector<int> >(5, vector<int>(5)));
    rep(z, 5) rep(y, 5) rep(x, 5) {
      char ch; cin >> ch;
      curr[z][y][x] = ch-'0';
    }
    
    int M1; cin >> M1; vector<int> a(M1);
    rep(i, M1) cin >> a[i];
    int M2; cin >> M2; vector<int> b(M2);
    rep(i, M2) cin >> b[i];
    
    rep(n, N) {
      vector<vector<vector<int> > > next(5, vector<vector<int> >(5, vector<int>(5)));
      rep(z, 5) rep(y, 5) rep(x, 5) {
        int cnt = 0;
        REP(dz,-1,2) REP(dy,-1,2) REP(dx,-1,2) {
          int nx = x+dx, ny = y+dy, nz = z+dz;
          if(dx == 0 && dy == 0 && dz == 0) { continue; }
          if(!inrange(nx, ny, nz)) { continue; }
          cnt += curr[nz][ny][nx];
        }
        
        if(!curr[z][y][x]) {
          bool ok = 0;
          rep(I, M1) if(a[I] == cnt) { ok = 1; break; }
          if(ok) { next[z][y][x] = 1; }
        }
        
        if(curr[z][y][x]) {
          bool ok = 0;
          rep(I, M2) if(b[I] == cnt) { ok = 1; break; }
          if(ok) { next[z][y][x] = 1; }
        }
      }
      curr = next;
    }
    
    if(Tcnt>1) cout << "\n";
    cout << "Case " << Tcnt << ":";
    rep(z, 5) {
      cout << endl;
      rep(y, 5) {
        rep(x, 5) cout << curr[z][y][x];
        cout << endl;
      }
    }
  }
  
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1224
final_rank: 13

code_snippet: #include <bits/stdc++.h>

using namespace std;

bool field[5][5][5];

inline bool inField(int x,int y,int z){
  if(0 > x || x >= 5) return false;
  if(0 > y || y >= 5) return false;
  if(0 > z || z >= 5) return false;
  return true;
}

int getNum(int x,int y,int z,bool f){
  int res = 0;
  for(int zz = z-1 ; zz <= z+1 ; zz++){
    for(int yy = y-1 ; yy <= y+1 ; yy++){
      for(int xx = x-1 ; xx <= x+1 ; xx++){
        if(xx == x && yy == y && zz == z) continue;
        if(!inField(xx,yy,zz)) continue;
        if(field[yy][xx][zz] == f){
          res++;
        }
      }
    }
  }
  return res;
}

int main(){
  int N,Tc = 0;
  bool space = false;
  while(cin >> N, N > 0){
    if(space) cout << endl;
    else space = true;
    for(int z = 0 ; z < 5 ; z++){
      string str;
      for(int y = 0 ; y < 5 ; y++){
        cin >> str;
        for(int x = 0 ; x < 5 ; x++){
          field[y][x][z] = str[x]-'0';
        }
      }
    }
    int M[2],a[27],b[27];
    cin >> M[0];
    for(int i = 0 ; i < M[0] ; i++){
      cin >> a[i];
    }
    cin >> M[1];
    for(int i = 0 ; i < M[1] ; i++){
      cin >> b[i];
    }
    while(N--){
      bool next[5][5][5];
      for(int z = 0 ; z < 5 ; z++){
        for(int y = 0 ; y < 5 ; y++){
          for(int x = 0 ; x < 5 ; x++){
            int num;
            bool f = field[y][x][z];
            if(f){
              num = getNum(x,y,z,true);
              bool ok = false;
              for(int i = 0 ; i < M[1] ; i++){
                if(num == b[i]){
                  ok = true;
                  break;
                }
              }
              if(!ok){
                f = !f;
              }
            }else{
              num = getNum(x,y,z,true);
              bool ok = false;
              for(int i = 0 ; i < M[0] ; i++){
                if(num == a[i]){
                  ok = true;
                  break;
                }
              }
              if(ok){
                f = !f;
              }
            }
            next[y][x][z] = f;
          }
        }
      }
      for(int z = 0 ; z < 5 ; z++){
        for(int y = 0 ; y < 5 ; y++){
          for(int x = 0 ; x < 5 ; x++){
            field[y][x][z] = next[y][x][z];
          }
        }
      }
    }
    cout << "Case " << ++Tc << ":" << endl;
    for(int z = 0 ; z < 5 ; z++){
      for(int y = 0 ; y < 5 ; y++){
        for(int x = 0 ; x < 5 ; x++){
          cout << field[y][x][z];
        }
        cout << endl;
      }
      if(z != 4){
        cout << endl;
      }
    }
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1208
final_rank: 3

code_snippet: #include <bits/stdc++.h>
using namespace std;
 
bool check(int x,int y, int z) {
  if(x<0 || x>=5) return false;
  if(y<0 || y>=5) return false;
  if(z<0 || z>=5) return false;
  return true;
}
 
int main() {
  int n,t=1;
  while(cin >> n && n) {
    int a[5][5][5];
    for(int i=0; i<5; i++) {
      for(int j=0; j<5; j++) {
    string s;
    cin >> s;
    for(int k=0; k<5; k++) {
      if(s[k]=='1') a[i][j][k]=1;
      else a[i][j][k]=0;
    }
      }
    }
    int m1,m2;
    set<int> s1,s2;
    cin >> m1;
    while(m1--) {
      int x;
      cin >> x;
      s1.insert(x);
    }
    cin >> m2;
    while(m2--) {
      int x;
      cin >> x;
      s2.insert(x);
    }
    while(n--) {
      int b[5][5][5];
      for(int i=0; i<5; i++) {
    for(int j=0; j<5; j++) {
      for(int k=0; k<5; k++) b[i][j][k]=a[i][j][k];
    }
      }
      for(int i=0; i<5; i++) {
    for(int j=0; j<5; j++) {
      for(int k=0; k<5; k++) {
        int cnt=0;
        for(int dx=-1; dx<=1; dx++) {
          for(int dy=-1; dy<=1; dy++) {
        for(int dz=-1; dz<=1; dz++) {
          int x=i+dx,y=j+dy,z=k+dz;
          if(x==i && y==j && z==k) continue;
          if(check(x,y,z)) cnt+=b[x][y][z];
        }
          }
        }
        if(b[i][j][k]) {
          if(!s2.count(cnt)) a[i][j][k]=0;
        } else {
          if(s1.count(cnt)) a[i][j][k]=1;
        }
      }
    }
      }
    }
    if(t>1) cout << endl;
    cout << "Case " << t++ << ":" << endl;
    for(int i=0; i<5; i++) {
      if(i) cout << endl;
      for(int j=0; j<5; j++) {
    for(int k=0; k<5; k++) cout << a[i][j][k];
    cout << endl;
      }
    }
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include<bits/stdc++.h>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)

using namespace std;

bool a[5][5][5][2];
int M1,M2;
int alpha[30], beta[30];

inline bool isValid(int x,int y,int z) { return 0 <= x && x < 5 && 0 <= y && y < 5 && 0 <= z && z < 5; }

bool ok(bool type,int v){
  if( !type ) rep(i,M1) if( alpha[i] == v ) return true;
  if(  type ) rep(i,M2) if(  beta[i] == v ) return true;
  return false;
}

void print(int type){
  rep(z,5) {
    if( z ) puts("");
    rep(y,5) {
      rep(x,5) {
	cout << a[z][y][x][type];
      } puts("");
    }
  }
}

int main(){
  int N,CNT=1;
  bool fu = 1;
  while( cin >> N, N ){
    if( !fu ) puts("");
    fu = false;
    rep(z,5) rep(y,5) {
      string s;
      cin >> s;
      rep(x,5) a[z][y][x][0] = (s[x]=='0'?false:true);
    }

    //print(0);

    cin >> M1; rep(i,M1) cin >> alpha[i];
    cin >> M2; rep(i,M2) cin >> beta[i];
    printf("Case %d:\n",CNT++);
    rep(i,5) rep(j,5) rep(k,5) a[i][j][k][1] = false;

    int phase = 0;    
    rep(day,N) { 
      rep(z,5) rep(y,5) rep(x,5) {
	int cur = phase&1;
	int next = (phase+1)&1;
	bool type = a[z][y][x][cur];
	int cnt = 0;
	for(int dz=-1;dz<=1;dz++){
	  for(int dy=-1;dy<=1;dy++){
	    for(int dx=-1;dx<=1;dx++){
	      if( dz == 0 && dy == 0 && dx == 0 ) continue;
	      int nz = z + dz, ny = y + dy, nx = x + dx;
	      if( !isValid(nx,ny,nz) ) continue;
	      bool v = a[nz][ny][nx][cur];
	      //cout << "(" << nx << "," << ny << "," << nz << ") " << a[nz][ny][nx][cur] << "!!" << endl;
	      if( v ) ++cnt;
	      /*
	      if( !type &&  v ) ++cnt;
	      if(  type && !v ) ++cnt;
	      */
	    }	

	  }	
	}

	if( !type ) a[z][y][x][next] = ( ok(type,cnt) ) ? true : false;
	if(  type ) a[z][y][x][next] = ( ok(type,cnt) ) ? true : false;

      }
      ++phase;
    }

    print(phase&1);

  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1240
final_rank: 17

code_snippet: #include <bits/stdc++.h>
using namespace std;

bool check(int x,int y, int z) {
  if(x<0 || x>=5) return false;
  if(y<0 || y>=5) return false;
  if(z<0 || z>=5) return false;
  return true;
}

int main() {
  int n,t=1;
  while(cin >> n && n) {
    int a[5][5][5];
    for(int i=0; i<5; i++) {
      for(int j=0; j<5; j++) {
	string s;
	cin >> s;
	for(int k=0; k<5; k++) {
	  if(s[k]=='1') a[i][j][k]=1;
	  else a[i][j][k]=0;
	}
      }
    }
    int m1,m2;
    set<int> s1,s2;
    cin >> m1;
    while(m1--) {
      int x;
      cin >> x;
      s1.insert(x);
    }
    cin >> m2;
    while(m2--) {
      int x;
      cin >> x;
      s2.insert(x);
    }
    while(n--) {
      int b[5][5][5];
      for(int i=0; i<5; i++) {
	for(int j=0; j<5; j++) {
	  for(int k=0; k<5; k++) b[i][j][k]=a[i][j][k];
	}
      }
      for(int i=0; i<5; i++) {
	for(int j=0; j<5; j++) {
	  for(int k=0; k<5; k++) {
	    int cnt=0;
	    for(int dx=-1; dx<=1; dx++) {
	      for(int dy=-1; dy<=1; dy++) {
		for(int dz=-1; dz<=1; dz++) {
		  int x=i+dx,y=j+dy,z=k+dz;
		  if(x==i && y==j && z==k) continue;
		  if(check(x,y,z)) cnt+=b[x][y][z];
		}
	      }
	    }
	    if(b[i][j][k]) {
	      if(!s2.count(cnt)) a[i][j][k]=0;
	    } else {
	      if(s1.count(cnt)) a[i][j][k]=1;
	    }
	  }
	}
      }
    }
    if(t>1) cout << endl;
    cout << "Case " << t++ << ":" << endl;
    for(int i=0; i<5; i++) {
      if(i) cout << endl;
      for(int j=0; j<5; j++) {
	for(int k=0; k<5; k++) cout << a[i][j][k];
	cout << endl;
      }
    }
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include <iostream>
#include <complex>
#include <sstream>
#include <string>
#include <algorithm>
#include <deque>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
#include <set>
#include <limits>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, j) for(int i = 0; i < (int)(j); ++i)
#define FOR(i, j, k) for(int i = (int)(j); i < (int)(k); ++i)
#define SORT(v) sort((v).begin(), (v).end())
#define REVERSE(v) reverse((v).begin(), (v).end())
typedef complex<double> P;
const int L = 5;


int N, v[L][L][L], t[L][L][L], c = 1;

int main() {
  while(cin >>N && N){
    if(c != 1) cout <<endl;
    REP(z, L){
      REP(y, L){
        string s; cin >>s;
        REP(x, L) v[z][y][x] = s[x] - '0';
      }
    }
    int MA; cin >>MA; vector<int> A(MA); REP(i, MA) cin >>A[i];
    int MB; cin >>MB; vector<int> B(MB); REP(i, MB) cin >>B[i];
    REP(n, N){
      REP(z, L){
        REP(y, L){
          REP(x, L){
            int cnt = 0;
            FOR(mz, -1, 2) FOR(my, -1, 2) FOR(mx, -1, 2) if(!(mz == 0 && my == 0 && mx == 0) && z + mz >= 0 && y + my >= 0 && x + mx >= 0 && z + mz < L && y + my < L && x + mx < L) cnt += v[z + mz][y + my][x + mx];
            if(v[z][y][x]){
              int f = 0;
              REP(i, MB) if(cnt == B[i]) f = 1;
              t[z][y][x] = f;
            } else{
              int f = 0;
              REP(i, MA) if(cnt == A[i]) f = 1;
              t[z][y][x] = f;
            }
          }
        }
      }
      REP(i, L) REP(j, L) REP(k, L) v[i][j][k] = t[i][j][k];
    }
    cout <<"Case " <<c++ <<":" <<endl;
    REP(z, L){
      REP(y, L){
        REP(x, L) cout <<v[z][y][x];
        cout <<endl;
      }
      if(z + 1 != L) cout <<endl;
    }
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include <bits/stdc++.h>
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
using namespace std;
typedef long long LL;
bool valid(int x) {
    return 0 <= x && x < 5;
}

int main(){
    int N;
    int C = 0;
    while(cin >> N && N > 0) {
        if(C != 0) cout << endl;
        cout << "Case " << ++C << ":" << endl;
        int grid[5][5][5] = {};

        REP(z, 5) REP(y, 5) {
            string s;
            cin >> s;
            REP(x, 5) grid[z][y][x] = s[x] == '1';
        }

        vector<int> A;
        int M; cin >> M;
        A.resize(M);
        REP(i, M) { cin >> A[i]; }

        vector<int> B;
        cin >> M;
        B.resize(M);
        REP(i, M) { cin >> B[i]; }

        REP(_, N) {
            int cnt[5][5][5] = {};
            REP(sz, 5) REP(sy, 5) REP(sx, 5) {
                REP(dz, 3) REP(dy, 3) REP(dx, 3) {
                    int x = sx + dx - 1;
                    int y = sy + dy - 1;
                    int z = sz + dz - 1;
                    if(dx == 1 && dy == 1 && dz == 1) continue;
                    if(valid(x) && valid(y) && valid(z)) {
                        cnt[sz][sy][sx] += grid[z][y][x];
                    }
                }
            }

            REP(z, 5) REP(y, 5) REP(x, 5) {
                if(grid[z][y][x] == 0) {
                    int next = 0;
                    for(int a : A) if(cnt[z][y][x] == a) next = 1;
                    grid[z][y][x] = next;
                } else {
                    int next = 0;
                    for(int b : B) if(cnt[z][y][x] == b) next = 1;
                    grid[z][y][x] = next;
                }
            }
        }

        REP(z, 5) {
            REP(y, 5){
                REP(x, 5) cout << grid[z][y][x];
                cout << endl;
            }
            if(z != 4) cout << endl;
        }
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 5

code_snippet: #include <iostream>
#include <vector>
#include <set>

using namespace std;

class range {
private:
  struct Iterator {
    int val;
    int operator*() {return val;}
    bool operator!=(Iterator& itr) {return val < itr.val;}
    void operator++() {++val;}
  };
  Iterator i, n;
public:
  range(int n) : i({0}), n({n}) {}
  range(int i, int n) : i({i}), n({n}) {}
  Iterator& begin() {return i;}
  Iterator& end() {return n;}
};

template<class T> inline T at(const vector<T> &v, int i) {return v[(i % (int)v.size() + v.size()) % v.size()];}

template<class T> inline bool is_max(T &a, const T &b) {return a < b ? a = b, true : false;}
template<class T> inline bool is_min(T &a, const T &b) {return a > b ? a = b, true : false;}

int main() {
  int t = 0;
  while (true) {
    int n;
    cin >> n;
    if (n == 0) break;
    if (t > 0) cout << endl;
    vector<vector<string>> box(5, vector<string>(5));
    for (int i : range(5)) for (int j : range(5)) cin >> box[i][j];
    int m1, m2;
    cin >> m1;
    set<int> a;
    for (int _ : range(m1)) {
      int aa;
      cin >> aa;
      a.insert(aa);
    }
    cin >> m2;
    set<int> b;
    for (int _ : range(m2)) {
      int bb;
      cin >> bb;
      b.insert(bb + 1);
    }
    for (int _ : range(n)) {
      vector<vector<string>> next = box;
      for (int i : range(5)) for (int j : range(5)) for (int k : range(5)) {
        if (box[i][j][k] == '0') {
          int cnt = 0;
          for (int ii : range(-1, 2)) for (int jj : range(-1, 2)) for (int kk : range(-1, 2)) {
            if (i + ii < 0 || 5 <= i + ii) continue;
            if (j + jj < 0 || 5 <= j + jj) continue;
            if (k + kk < 0 || 5 <= k + kk) continue;
            if (box[i + ii][j + jj][k + kk] == '1') ++cnt;
          }
          if (a.count(cnt)) next[i][j][k] = '1';
        } else {
          int cnt = 0;
          for (int ii : range(-1, 2)) for (int jj : range(-1, 2)) for (int kk : range(-1, 2)) {
            if (i + ii < 0 || 5 <= i + ii) continue;
            if (j + jj < 0 || 5 <= j + jj) continue;
            if (k + kk < 0 || 5 <= k + kk) continue;
            if (box[i + ii][j + jj][k + kk] == '1') ++cnt;
          }
          if (!b.count(cnt)) next[i][j][k] = '0';
        }
      }
      box = next;
    }
    cout << "Case " << ++t << ":" << endl;
    for (int i : range(5)) {
      for (int j : range(5)) cout << box[i][j] << endl;
      if (i != 4) cout << endl;
    }
  }
}
accuracy: 1
time_ms: 10
memory_kb: 1224
final_rank: 13