我有一个c语言的程序,它不能很好地执行奇偶校验

2eafrhcq  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(160)

我的代码不显示大于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方向)。

63lcw9qa

63lcw9qa1#

解决方案是将check更改为仅考虑先前设置的值。这非常容易,因为您可以利用它们设置的顺序。只需要排除最后两种情况,所以你最终得到:

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
    }
    return true; //all neighbors respect the parity condition
}

这仅检查当前值的上方和左侧的值。
请注意,它不足以检查零值,因为它会在回溯后失败(在这种情况下,后续值不保证为零)。

iibxawm4

iibxawm42#

代码检查矩阵 * 中的值,同时 * 它正在构建,所以一些邻居仍然是0。您可以更改check中的条件,如下所示:

if (     row > 0  
     &&  matrix[row-1][col] != 0
     && (val - matrix[row-1][col]) % 2 == 0 ) {
    return false; // check parity with northern neighbor
}

但是请注意,您可以利用这样一个事实,即只有具有交替奇数和偶数值模式的矩阵才是可能的解决方案。

相关问题