#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fenzu[6][6];
int used_fenzu[6][6];//根据分组信息确定第一位;根据字母排列A B C D E F确定第二位;最终依靠本数组实现"组内判重"
int used_row[6][6];//第一位为行数
int used_col[6][6];//第一位为列数
char map[6][6];
int next_row[40];
int next_col[40];
int all = 1;
void print()
{
int i, j;
for(i = 0; i < 6; i++){for(j = 0; j < 6; j++){printf("%c",map[i][j]);}printf("\n");}
}
int cango(int r, int c, char ch)
{
if(used_fenzu[ fenzu[r][c] ][ ch-'A' ] == 1 || used_row[r][ch-'A'] == 1 || used_col[c][ch-'A'] == 1)
return 0;
return 1;
}
void fun(int r, int c, int n)
{
char ch;
int i, j;
//printf("r = %d, c = %d, n = %d\n",r,c,n);
if(n == 36)
{
printf("%d\n",all++);
print();
return;
}
for(ch = 'A'; ch <= 'F'; ch++)
{
if( cango(r, c, ch) )
{
map[r][c] = ch;
used_fenzu[ fenzu[r][c] ][ ch-'A' ] = 1;
used_row[r][ch-'A'] = 1;
used_col[c][ch-'A'] = 1;
fun(next_row[n+1], next_col[n+1], n+1);
map[r][c] = 0;
used_fenzu[ fenzu[r][c] ][ ch-'A' ] = 0;
used_row[r][ch-'A'] = 0;
used_col[c][ch-'A'] = 0;
}
}
return;
}
int main()
{
int N, i, j, temp_N, index;
freopen("1.txt", "r", stdin);
memset(map, 0, sizeof(map));
for(i = 0; i < 6; i++)
{
for(j = 0; j < 6; j++)
{
scanf("%1d", &fenzu[i][j]);
}
}
scanf("%d", &N);
temp_N = N;
while(temp_N--)
{
int r, c;
char ch;
scanf("%1d%1d%c", &r, &c, &ch);
map[r][c] = ch;
used_fenzu[ fenzu[r][c] ][ ch-'A' ] = 1;
used_row[r][ch-'A'] = 1;
used_col[c][ch-'A'] = 1;
}
index = N;
for(i = 0; i < 6; i++)
{
for(j = 0; j < 6; j++)
{
if( map[i][j] == 0)
{
next_row[index] = i;
next_col[index] = j;
index++;
}
}
}
fun(next_row[N],next_col[N],N);
return 0;
}