#include<bits/stdc++.h>
using namespace std;
//印出盤面
void print(int r,int c,char data[60][60])
{
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cout<<data[i][j];
}
cout<<endl;
}
}
//算某個點的上下左右邊位置
vector<pair<int,int> > get8side(int i,int j,int r,int c)
{
vector<pair<int,int> > sides;
if(i!=0)
sides.push_back(make_pair(i-1,j));
if(j!=0)
sides.push_back(make_pair(i,j-1));
if(i<r-1)
sides.push_back(make_pair(i+1,j));
if(j<c-1)
sides.push_back(make_pair(i,j+1));
if(i!=0 && j!=0)
sides.push_back(make_pair(i-1,j-1));
if(i!=0 && j<c-1)
sides.push_back(make_pair(i-1,j+1));
if(i<r-1 && j!=0)
sides.push_back(make_pair(i+1,j-1));
if(i<r-1 && j<c-1)
sides.push_back(make_pair(i+1,j+1));
return sides;
}
//確認這一點的數字是不是0
bool checkZero(int i,int j,int r,int c,char data[60][60])
{
if(data[i][j]=='*')
return false;
vector<pair<int,int> > side=get8side(i,j,r,c);
for(int i=0;i<side.size();i++)
{
if(data[side[i].first][side[i].second]=='*')
return 0;
}
return true;
}
void dfs(int i,int j,int r,int c,char data[60][60],bool visit[60][60])
{
if(visit[i][j]==1) return;
visit[i][j]=1;
if(!checkZero(i,j,r,c,data)) return;
vector<pair<int,int> > side=get8side(i,j,r,c);
for(vector<pair<int,int> >::iterator iter=side.begin();iter!=side.end();iter++)
{
dfs(iter->first,iter->second,r,c,data,visit);
}
}
//確認盤面是否合理
bool check(int r,int c,char data[60][60])
{
bool visit[60][60]={0};
for(int i2=0;i2<r;i2++)
for(int j2=0;j2<c;j2++)
if(data[i2][j2]=='c')
{
dfs(i2,j2,r,c,data,visit);
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
{
if(data[i][j]!='*' && visit[i][j]==0){
return false;
}
}
return true;
}
}
int main()
{
int T,no=1;
cin>>T;
int r,c,m;
char data[60][60];
while(T--)
{
cin>>r>>c>>m;
cout<<"Case #"<<no++<<": "<<endl;
memset(data,'.',sizeof data);
data[0][0]='c';
int lr=r-1,lc=c-1;//右下角還沒擺地雷的那個點的座標
//用while迴圈持續放地雷,m帶表剩下的地雷數
while(1)
{
if(m==0) //全部擺完
{
if(check(r,c,data))
print(r,c,data);
else
cout<<"Impossible\n";
break;
}
else if(m<lr+1 && m<lc+1) //無法擺滿一行
{
if(lr+lc-3>=m){
for(int i=lc;i>=2;i--){
if(m==0)break;
data[lr][i]='*';
m--;
}
for(int i=lr-1;i>=2;i--){
if(m==0)break;
data[i][lc]='*';
m--;
}
if(check(r,c,data))
print(r,c,data);
else
cout<<"Impossible\n";
}
else
cout<<"Impossible\n";
break;
}
//擺右邊及擺下面
else if(lc>lr)
{
for(int i=0;i<=lr;i++){
data[i][lc]='*';
m--;
}
lc--;
}
else
{
for(int i=0;i<=lc;i++){
data[lr][i]='*';
m--;
}
lr--;
}
}
}
}