用C语言编写一下程序给出一个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 *134Case #1: 1432 2341 4123 3214 Case #2: 1243 4312 3421 2134
时间: 2024-03-06 19:49:29 浏览: 90
螺旋矩阵c语言源码.zip
好的,这是一道经典的算法题,叫做“数独变形”。以下是 C 语言的实现代码:
```c
#include <stdio.h>
#define N 4
int matrix[N][N];
void dfs(int row, int col) {
if (row == N && col == 1) { // 输出矩阵
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
printf("%d", matrix[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
if (col > N) { // 列越界,换行
row++;
col = 1;
}
if (row <= 2 && col <= 2) { // 左上角的 2*2 矩阵
for (int i = 1; i <= N; i++) {
int flag = 0;
for (int j = 1; j <= col - 1; j++) {
if (matrix[row][j] == i) { // 列重复
flag = 1;
break;
}
}
for (int j = 1; j <= row - 1; j++) {
if (matrix[j][col] == i) { // 行重复
flag = 1;
break;
}
}
if (flag) continue;
matrix[row][col] = i;
dfs(row, col + 1);
matrix[row][col] = 0;
}
} else if (row <= 2 && col >= 3) { // 右上角的 2*2 矩阵
for (int i = 1; i <= N; i++) {
int flag = 0;
for (int j = 1; j <= col - 1; j++) {
if (matrix[row][j] == i) { // 列重复
flag = 1;
break;
}
}
for (int j = 1; j <= row - 1; j++) {
if (matrix[j][col] == i) { // 行重复
flag = 1;
break;
}
}
if (flag) continue;
if (matrix[row - 1][col - 1] == i) continue; // 对角线重复
matrix[row][col] = i;
dfs(row, col + 1);
matrix[row][col] = 0;
}
} else if (row >= 3 && col <= 2) { // 左下角的 2*2 矩阵
for (int i = 1; i <= N; i++) {
int flag = 0;
for (int j = 1; j <= col - 1; j++) {
if (matrix[row][j] == i) { // 列重复
flag = 1;
break;
}
}
for (int j = 1; j <= row - 1; j++) {
if (matrix[j][col] == i) { // 行重复
flag = 1;
break;
}
}
if (flag) continue;
if (matrix[row - 1][col + 1] == i) continue; // 对角线重复
matrix[row][col] = i;
dfs(row, col + 1);
matrix[row][col] = 0;
}
} else if (row >= 3 && col >= 3) { // 右下角的 2*2 矩阵
for (int i = 1; i <= N; i++) {
int flag = 0;
for (int j = 1; j <= col - 1; j++) {
if (matrix[row][j] == i) { // 列重复
flag = 1;
break;
}
}
for (int j = 1; j <= row - 1; j++) {
if (matrix[j][col] == i) { // 行重复
flag = 1;
break;
}
}
if (flag) continue;
if (matrix[row - 1][col - 1] == i || matrix[row - 1][col + 1] == i) continue; // 对角线重复
matrix[row][col] = i;
dfs(row, col + 1);
matrix[row][col] = 0;
}
}
}
int main() {
int T;
scanf("%d", &T);
for (int i = 1; i <= T; i++) {
printf("Case #%d:\n", i);
dfs(1, 1);
}
return 0;
}
```
程序中的 `dfs` 函数是递归的核心部分,它通过枚举每个格子可以填的数字,然后递归下去,直到填满整个矩阵或者发现无解为止。在枚举之前,需要先检查当前格子所在的行和列是否已经出现了相同的数字,如果有,就不能填这个数字。另外,在填右上角和右下角的矩阵时,还需要检查对角线上的数字是否重复。
阅读全文