矩阵的传递性

时间:2019-10-26 18:04:58

标签: c++ matrix

我正在尝试实现一种c ++解决方案,以查找n * n个元素的二进制矩阵是否可传递。 这是条件:

  

当且仅当对于元素a,b,c(a!=   b!= c)使得M [a] [b] = 1且M [b] [c] = 1,条件M [a] [c] =   1是正确的。

如果矩阵是可传递的,则输出应为1,否则为0。

我的代码:

#include<iostream> 
using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n;
    bool trans = true;
    cin >> n;

    int **m = new int*[n];
    for (int i = 0; i < n; i++) {
        m[i] = new int[n];
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> m[i][j];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (m[i][j] == 1 && m[j][i] == 1 && m[i][i] != 1)
                trans = false;
        }
    }

    if (trans)
        cout << 1;
    else
        cout << 0;
}

该代码未通过我要提交的电子裁判。可能是什么问题?

3 个答案:

答案 0 :(得分:0)

#include<iostream> 
using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n;
    bool trans = true;
    cin >> n;

    int **m = new int*[n];
    for (int i = 0; i < n; i++) {
        m[i] = new int[n];
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> m[i][j];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++)
            {
                if ((i!=j && j!=k) && !(m[i][j] == 1 && m[j][k] == 1 && m[k][i] == 1))
                    trans = false;
            }
        }
    }

    if (trans)
        cout << 1;
    else
        cout << 0;
}

尝试此代码,可以正常工作

答案 1 :(得分:0)

您需要3个for循环,而不是2个(i,j和k)。

答案 2 :(得分:0)

问题指出:

  

M[a][b] = 1 and M[b][c] = 1 the condition M[a][c] = 1 is true

您的测试(措辞):

  

m[i][j] == 1 && m[j][i] == 1 && m[i][i] == 1

在问题中,有三个索引。您只检查两个索引。您需要遍历ijk。您还只需要在i != j and j != k时执行此检查。

所以,这样的事情-无需使用裸露的阵列和其他类似的愚蠢行为。

#include<iostream> 
#include<vector>

struct int_iter {
    int val = {};
    operator int() const { return val; }
    int operator*() const { return val; }
    int_iter operator++() { val += 1; return {val}; }
};

struct range_n {
    int n;
    range_n(int n = 1) : n(n) {}
    int_iter begin() const { return {}; }
    int_iter end() const { return {n}; }
    int square() const { return n*n; }
};

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    range_n span;
    std::cin >> span.n;

    std::vector<double> M(span.n * span.n);

    auto M_at = [&M,span](int i, int j)->auto& {return M[i*span.n + j];};

    for (auto i : span)
        for (auto j : span)
            std::cin >> M_at(i, j);

    for (auto i : span)
        for (auto j : span)
            if (i != j && M_at(i, j) == 1)
                for (auto k : span)
                    if (j != k && M_at(j, k) == 1 && M_at(i, k) != 1)
                    {
                        std::cout << 0 << std::endl;
                        return 1;
                    }

    std::cout << 1 << std::endl;
    return 0;
}