我有一个有趣的问题:
我的程序必须找到1
的最大数量。
但那还不是全部!
如果该程序已“看到”1
,则应清除1
所在的整个列和行。
我遇到的问题:
我找不到1
的最大数量,我不知道该怎么做。
对于你我做了一个小例子,我希望你能清楚。该计划必须像这样工作:
有一个矩阵:
1 0 0 0
1 0 1 1
1 1 1 1
1 0 0 1
该程序找到了1
(位置[0][0]
我在黑色中突出显示了它,并清除了行和列:
在此之后我们找到下一个1
,清除行和列,依此类推:
最后,程序应打印黑色单元格的数量。
在我的例子中,它是4
如何在C++
代码中执行此操作?请帮我!谢谢。
答案 0 :(得分:3)
我更喜欢这样做(参见下面的代码):使用两个“for”循环,在第二个内部使用条件“if”将第三个“for”循环添加到设置为0。
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(cow[j][i]==1)
{
cnt++;
for(int k=0;k<n;k++)
cow[k][i]=cow[j][k]=0;
break;
}
}
答案 1 :(得分:2)
目前尚不清楚如何在矩阵中搜索“下一个”1以及矩阵是否只能包含0和1.但如果有明确的“下一个”定义,那么您只需编码就像您一样已在上面描述过。可能的代码片段如下所示(未测试,甚至未编译):
bool find_next_one(int&x, int&y, matrix const&M)
{
// next is in (col,row) order
for(; x!=M.size(0); ++x)
for(; y!=M.size(1); ++y)
if(M(x,y)==1) return 1;
return 0;
}
int count_one(matrix const&M_original)
{
matrix M(M_original); // make copy where we can set elements to 0
int count=0;
int x=0,y=0;
while(find_next_one(x,y,M)) {
++count;
for(int i=0; i!=M.size(1); ++i) M(x,i) = 0;
for(int i=0; i!=M.size(0); ++i) M(i,y) = 0;
}
return count;
}
答案 2 :(得分:1)
注意到这看起来像矩阵奇点类型检查 - 特别是如果1和0是唯一要使用的东西。
您可以检查矩阵的确定性。非零意味着它等于行数和列数(如果矩阵总是方形的。)如果是det(0),那么使用任何你想要将矩阵缩小到简化形式的技术来查看有多少0列你有 - 或者只是先减少并沿着对角线计数。
按照其附加值对列进行排序,将以对角线形式为您提供。这样可以很容易地检查0列。
答案 3 :(得分:1)
我不会为你编写所有代码,但会建议一些让你走上正轨的东西。您应该了解如何迭代二维数组(矩阵)以及如何迭代该矩阵中的单个行或列。
给定矩阵的(硬编码)定义,如下所示:
struct Matrix4x4
{
int m[4][4];
};
迭代你想写的所有元素:
Matrix4x4 matrix;
for (size_t row = 0; row < 4; ++row)
{
for (size_t col = 0; col < 4; ++col)
{
// do something with 'matrix.m[row][col]'
}
}
这将从左上角(0,0)到右下角(3,3)遍历矩阵。我假设这是你被告知使用的遍历顺序。
要处理您要编写如下内容的行:
void FunctionThatOperatesOnARow(Matrix4x4& matrix, size_t row)
{
for (size_t col = 0; col < 4; ++col)
{
// do something with 'matrix.m[row][col]'
}
}
要处理要编写如下内容的列:
void FunctionThatOperatesOnAColumn(Matrix4x4& matrix, size_t col)
{
for (size_t row = 0; row < 4; ++row)
{
// do something with 'matrix.m[row][col]'
}
}
你现在需要做的是修改迭代所有元素的代码的第一位并让它检查1.你需要调用相应的函数来清除当前的列和行(你可以根据关于后两个例子)。
对于最终结果,每次检测到1时都可以简单地递增一个本地计数器变量。