解析
本题的关键是暴力与构造结合的思想
本题一排排往上填的想法不难得出,但是在列数较小的时候就会GG
所以考虑在n>=5,m<5时,交换n,m,显然问题还是等价的
如果nm均小于5,就直接暴力dfs解决
在最后的边界需要打亿个小表
还有一个特殊情况需要特判
3100岂是浪得虚名
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
const int mod=1e9+7;
#define ll long long
ll read(){
ll x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};
while(isdigit(c)){x=x*10+c-'0';c=getchar();};
return x*f;
}
int n,m,k;
vector<int>s[N];
int a[16][16],flag;
void dfs(int x,int y){
if(y>m){
dfs(x+1,1);return;
}
if(x>n){
int num(0);
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
int cnt=a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1];
if(cnt==3) num++;
if(cnt==4) num+=4;
}
}
if(num==k){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) putchar(a[i][j]||(k==0&&i==1&&j==1)?'*':'.');
putchar('\n');
}
flag=1;
}
return;
}
a[x][y]=0;dfs(x,y+1);if(flag) return;
a[x][y]=1;dfs(x,y+1);
a[x][y]=0;
}
void bf(){
dfs(1,1);
if(!flag) printf("-1\n");
putchar('\n');
return;
}
void work1(){
int x=m-5;
//printf("k=%d\n",k);
if(m==5){
if(k==0){
flag=1;return;
}
if(k==1){
s[n][1]=1;
flag=1;return;
}
if(k==2){
s[n][1]=s[n][5]=1;
flag=1;return;
}
if(k==3){
s[n][1]=s[n][3]=1;
flag=1;return;
}
if(k==4){
s[n][2]=s[n][4]=1;
flag=1;return;
}
if(k==5){
s[n][1]=s[n][2]=1;
flag=1;return;
}
if(k==6){
s[n][1]=s[n][2]=s[n][5]=1;
flag=1;return;
}
if(k==7){
s[n][1]=s[n][2]=s[n][4]=1;
flag=1;return;
}
if(k==8){
flag=0;return;
}
if(k==9){
s[n][1]=s[n][2]=s[n][3]=1;
flag=1;return;
}
if(k==10){
s[n][1]=s[n][2]=s[n][4]=s[n][5]=1;
flag=1;return;
}
if(k==11){
flag=0;return;
}
if(k==12){
flag=0;
return;
}
if(k==13){
s[n][1]=s[n][2]=s[n][3]=s[n][4]=1;
flag=1;return;
}
if(k==14){
flag=0;
return;
}
if(k==15){
flag=0;
return;
}
if(k==16){
s[n][1]=s[n][3]=s[n][4]=s[n][5]=s[n][2]=1;
flag=1;return;
}
flag=0;return;
}
else{
if(k==0){
flag=1;return;
}
if(k==1){
s[n][m]=1;
flag=1;return;
}
if(k==2){
s[n][x+2]=1;
flag=1;return;
}
if(k==3){
s[n][x+2]=s[n][m]=1;
flag=1;return;
}
if(k==4){
s[n][x+2]=s[n][x+4]=1;
flag=1;return;
}
if(k==5){
s[n][x+1]=s[n][m]=1;
flag=1;return;
}
if(k==6){
s[n][x+1]=s[n][x+4]=1;
flag=1;return;
}
if(k==7){
s[n][x+2]=s[n][x+4]=s[n][x+5]=1;
flag=1;return;
}
if(k==8){
s[n][x+1]=s[n][x+2]=1;
flag=1;return;
}
if(k==9){
s[n][x+1]=s[n][x+2]=s[n][m]=1;
flag=1;return;
}
if(k==10){
s[n][x+1]=s[n][x+2]=s[n][x+4]=1;
flag=1;return;
}
if(k==11){
flag=0;return;
}
if(k==12){
s[n][x+1]=s[n][x+2]=s[n][x+3]=1;
flag=1;return;
}
if(k==13){
s[n][x+1]=s[n][x+2]=s[n][x+4]=s[n][x+5]=1;
flag=1;return;
}
if(k==14){
flag=0;return;
}
if(k==15){
flag=0;return;
}
if(k==16){
s[n][x+1]=s[n][x+2]=s[n][x+3]=s[n][x+4]=1;
flag=1;return;
}
if(k==19){
s[n][x+1]=s[n][x+2]=s[n][x+3]=s[n][x+4]=s[n][x+5]=1;
flag=1;return;
}
flag=0;return;
}
}
void work2(int x,int y){
flag=1;
if(k==0) return;
y--;
//printf("k=%d\n",k);
if(k==1){
if(y<=m-2) s[x][m]=1;
else s[x+1][1]=1;
return;
}
if(k==2){
if(y<=m-3) s[x][m-1]=1;
else s[x+1][2]=1;
return;
}
if(k==3){
if(y<=m-4){
s[x][y+2]=1;s[x][m]=1;
}
else if(y>=m-1){
s[x+1][1]=s[x+1][3]=1;
}
else if(y<=1){
s[x][3]=s[x][m]=1;
}
else if(y==m-2){
s[x+1][2]=1;s[x][m]=1;
}
else{
s[x+1][1]=1;s[x][m-1]=1;
}
return;
}
}
int main(){
#ifndef ONLINE_JUDGE
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
#endif
int T=read();
int tim(0),f(0);
while(T--){
flag=0;
n=read();m=read();k=read();
++tim;
//if(tim==1) f=n==12&&m==12&&k==400;
//assert(n<5&&m<5);
//++tim;
//if(oo==100&&tim>=60)
//if(f&&tim>=46) printf("%d %d %d\n",n,m,k);
//if(f) continue;
//if(oo==100) continue;
if(n<5&&m<5){
bf();continue;
}
bool jd(0);
if(n>m) swap(n,m),jd=1;
if(n==3&&k==8*(m-1)-8){
if(!jd){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) putchar(j==m?'.':'*');
putchar('\n');
}
}
else{
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++) putchar(j==1?'.':'*');
putchar('\n');
}
}
putchar('\n');
continue;
}
for(int i=1;i<=n;i++){
s[i].clear();s[i].shrink_to_fit();
s[i].resize(m+10);
for(int j=1;j<=m;j++) s[i][j]=i==1;
}
for(int i=2;i<=n;i++){
int o=0;
for(int j=1;j<=m;j++){
//printf("(%d %d) k=%d\n",i,j,k);
if(i==n&&m-j+1<=5){
o=1;work1();break;
}
if(k<4){
o=1;work2(i,j);break;
}
s[i][j]=1;
if(j==1) k-=1;
else if(j==m) k-=3;
else k-=4;
}
if(o) break;
}
if(!flag){
printf("-1\n");
putchar('\n');
continue;
}
if(!jd){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) putchar(s[i][j]?'*':'.');
putchar('\n');
}
}
else{
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++) putchar(s[i][j]?'*':'.');
putchar('\n');
}
}
putchar('\n');
}
return 0;
}
/*
*/