我正在尝试实现一种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;
}
该代码未通过我要提交的电子裁判。可能是什么问题?
答案 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
在问题中,有三个索引。您只检查两个索引。您需要遍历i
,j
,k
。您还只需要在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;
}