二进制暴力枚举,加唯一性限定。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <cmath>
#include <sstream>
#include <cctype>
#include <string>
#define mem(a, val) memset((a), (val), sizeof (a))
#define all(a) (a).begin(), (a).end()
using namespace std;
typedef long long LL;
const int maxn = 22;
const int dx[]={-1,0,1,0,0};
const int dy[]={ 0,1,0,-1,0};
int ans[maxn][maxn],vis[maxn][maxn],n,m;
int ma[maxn][maxn];
int flag;
int change(int x,int y,int v){
int ff = 1;
for(int d=0;d<5;d++){
int nx = dx[d]+x , ny=dy[d]+y;
if(nx>=0&&nx<n&&ny>=0&&ny<m){
vis[nx][ny]+=v;
if(vis[nx][ny] > ma[nx][ny]){
ff = 0;
}
if(x>0 && d==0 && vis[nx][ny]!=ma[nx][ny]){
ff =0;
}
if(x==n-1 && d==3 && vis[nx][ny]!=ma[nx][ny]){
ff =0;
}
}
}
return ff;
}
int change_back(int x,int y){
for(int d=0;d<5;d++){
int nx = dx[d]+x , ny=dy[d]+y;
if(nx>=0&&nx<n&&ny>=0&&ny<m){
vis[nx][ny]--;
}
}
}
void dfs(int i,int j){
int ti = i,tj=j+1;
if(flag) return ;
if(tj == m) tj=0,ti=i+1;
if(i==n&&j==0){
if(vis[n-1][m-1]!=ma[n-1][m-1]) return ;
flag = 1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%c",ans[i][j] ? '*':'.');
}
printf("\n");
}
return ;
}
for(int k=0;k<2;k++){
if(change(i,j,k)){
ans[i][j] = k;
dfs(ti,tj);
}
if(k==1) change_back(i,j);
}
}
int main()
{
char str[100];
int T,kase=1;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",str);
for(int j=0;j<m;j++) ma[i][j]=str[j]-'0';
}
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
printf("Case %d:\n",kase++);
flag = 0;
dfs(0,0);
}
return 0;
}