//题意不难理解,想了好几天都没有想到比较好的方法,最后看了下他们的解题报告写的,发现自己好水啊~~~
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
int n,row,col;
int map[15][15]; //存储01矩阵
char str[50][50]; //存放水分子的排布结构
void input() //输入
{
int i,j;
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
{
cin>>map[i][j];
}
row = n*4 - 3; //水分子结构图对应的行数
col = n*4 + 1; //水分子结构对应的列数
for(i = 0;i < row;i++) //str数组初始化
for(j = 0;j < col;j++)
str[i][j] = ' ';
}
void solve()
{
int r,c;
int i,j;
for(i = 0;i < n;i++)
{
r = i*4;
c = 2;
for(j = 0;j < n;j++,c += 4)
{
str[r][c] = 'O';
if(map[i][j] == 1) //当水分子结构分布为1的情况时
{
str[r][c-2] = 'H';
str[r][c+2] = 'H';
str[r][c-1] = '-';
str[r][c+1] = '-';
}
else if(map[i][j] == -1) //当水分子结构为-1的情况
{
str[r-2][c] = 'H';
str[r+2][c] = 'H';
str[r-1][c] = '|';
str[r+1][c] = '|';
}
else //水分子结构为0的情况
{
if(str[r][c-2] == 'H') //当左边有H的情况
{
str[r][c+1] = '-';
str[r][c+2] = 'H';
}
else
{
str[r][c-2] = 'H';
str[r][c-1] = '-';
}
if(r < 2 ||(r >= 2 && str[r-2][c] == 'H')) //当为第一行或是上一行已有H
{
str[r+1][c] = '|';
str[r+2][c] = 'H';
}
else
{
str[r-2][c] = 'H';
str[r-1][c] = '|';
}
}
}
}
}
void output() //输出水分子总体结构
{
int i,j;
for(i = 0;i < col+2;i++)
printf("*");
printf("\n");
for(i = 0;i < row;i++)
{
printf("*");
for(j = 0;j < col;j++)
printf("%c",str[i][j]);
printf("*\n");
}
for(i = 0;i < col+2;i++)
printf("*");
printf("\n");
}
int main()
{
int count = 0;
while(cin>>n && n)
{
input();
solve();
printf("Case %d:\n\n",++count);
output();
printf("\n");
}
return 0;
}