题目描述
给出一个4*4的矩阵,在矩阵中填入数字1,2,3,4,使得每行、每列的数字不重复,而且左上角、右上角、左下角、右下角的2*2小矩阵的4个数字不重复。
输入描述
输入包含多组测试数据。第一行为一个整数T(1<=T<=10),表示有T组测试数据。
第二行开始为T组测试数据。
输出描述
首先输出一行“Case #x:”,x表示第i组测试数据。
然后输出填充的4*4矩阵。每组测试数据之间输出一个空行。
输入样例
2
****
2341
4123
3214
*243
*312
*421
*134
输出样例
Case #1:
1432
2341
4123
3214
Case #2:
1243
4312
3421
2134
#include"stdio.h"
int jz,ii,n,T;
char ai[5][5];
int x[20],y[20],a[20],b[20]; //x,y数组用来保存每一个*号的横纵坐标 a,b数组用来记录每一个*所属的小正方形格
bool biaoji=false;
void dfs(int n) //不断地尝试 递归加回溯
{
if (biaoji)
return;
if (n==jz){
biaoji=true;
return;
}
int i,k;
char j;
bool sign1,sign2,sign3;
for (j='1';j<='4';j++){
if (biaoji)
return;
sign1=true;
sign2=true;
sign3=true;
ai[x[n]][y[n]]=j; //尝试赋值
//判断横向和纵向是否存在相同的值
for (i=0;i<4;i++){
if (i==y[n])
continue;
if (j==ai[x[n]][i]){
sign1=false;
break;
}
if (i==x[n])
continue;
if (j==ai[i][y[n]]){
sign2=false;
break;
}
}
if (!sign1||!sign2){
ai[x[n]][y[n]]=0;
continue;
}
//判断小正方形中是否存在相同的值
for (i = a[n]; i < a[n]+2; i++){
for (k = b[n]; k < b[n]+2; k++){
if (i == x[n] && k == y[n])
continue;
if (j == ai[i][k]){
sign3 = false;
break;
}
}
}
if (!sign3){
ai[x[n]][y[n]] = 0;
continue;
}
//尝试下一个待填区域
dfs(n+1);
}
}
void input()
{ //输入函数{
for (int i = 0; i < 4; i++){
scanf("%s",ai[i]);
for (int j = 0; j < 4; j++){
if (ai[i][j] == '*'){
x[n] = i;
y[n] = j;
n++;
}
}
}
}
void found() //记录每一个待填格所属小正方形
{
for (int i = 0; i < n; i++){
for (int j = 0; j <= 1; j++){
for (int k = 0; k <= 1; k++){
if (x[i]>=2*j && x[i]<=2*j+1 && y[i]>=2*k && y[i]<=2*k+1){
a[i] = j*2;
b[i] = k*2;
}
}
}
}
}
void output()
{ //输出函数{
printf("Case #%d:\n",ii);
for (int i = 0; i < 4; i++){
printf("%s\n",ai[i]);
}
if(ii!=T)
printf("\n");
}
int main()
{
scanf("%d",&T);
for(ii = 1; ii <= T; ii++){
n=0;
biaoji=false;
input();
found();
jz=n;
dfs(0);
output();
}
return 0;
}