我的代码不显示大于n〉1的矩阵
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 10
int n;
int matrix[MAX_N][MAX_N];
bool used[MAX_N * MAX_N + 1];
int count = 0;
bool check(int row, int col, int val) {
if (row > 0 && abs(val - matrix[row-1][col]) % 2 == 0) {
return false; // check parity with northern neighbor
}
if (col > 0 && abs(val - matrix[row][col-1]) % 2 == 0) {
return false; // check parity with western neighbor
}
if (row < n-1 && abs(val - matrix[row+1][col]) % 2 == 0) {
return false; // check parity with southern neighbor
}
if (col < n-1 && abs(val - matrix[row][col+1]) % 2 == 0) {
return false; // check parity with eastern neighbor
}
return true; //all neighbors respect the parity condition
}
void print_matrix() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
void backtrack(int row, int col) {
if (row == n) {
count++;
print_matrix();
return;
}
if (col == n) {
backtrack(row+1, 0);
return;
}
for (int val = 1; val <= n*n; val++) {
if (!used[val] && check(row, col, val)) {
matrix[row][col] = val;
used[val] = true;
backtrack(row, col+1);
used[val] = false;
}
}
}
int main() {
printf("Enter the size of the array n (maxim %d): ", MAX_N);
scanf("%d", &n);
if (n <= 0 || n > MAX_N) {
printf("The array size is invalid.\n");
return 0;
}
printf("The matrices that respect the condition are:\n");
backtrack(0, 0);
printf("Total number of arrays generated: %d\n", count);
return 0;
}
我试图解决当n〉1时显示矩阵的问题。或者如果我没有正确完成程序,您可以帮助我。这是我的任务生成所有包含集合{1,...,n^2}中不同元素的nxn矩阵,使得矩阵中没有元素与其邻居具有相同的奇偶性(元素的邻居被认为是N,S,E,W方向)。
2条答案
按热度按时间63lcw9qa1#
解决方案是将
check
更改为仅考虑先前设置的值。这非常容易,因为您可以利用它们设置的顺序。只需要排除最后两种情况,所以你最终得到:这仅检查当前值的上方和左侧的值。
请注意,它不足以检查零值,因为它会在回溯后失败(在这种情况下,后续值不保证为零)。
iibxawm42#
代码检查矩阵 * 中的值,同时 * 它正在构建,所以一些邻居仍然是0。您可以更改
check
中的条件,如下所示:但是请注意,您可以利用这样一个事实,即只有具有交替奇数和偶数值模式的矩阵才是可能的解决方案。