我试图看看我是否能找到n x n 2D数组中的整行是否都是零并且我最初有这个代码但是我被告知不要使用goto。我该如何解决这个问题?
int first_zero_row = -1;
int i, j;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++){
if(A[i][j]) goto next;
}
first_zero_row = i;
break;
next:
}
最有效的方式是什么?
答案 0 :(得分:1)
你可以试试这个
int first_zero_row = -1;
int flag, i, j;
for(i = 0; i < n; i++) {
flag = 1;
for(j = 0; j < n; j++) {
if(A[i][j]) {
flag = 0;
break;
}
}
if (flag) {
first_zero_row = i;
break;
}
}
答案 1 :(得分:1)
不使用固定的零数组和系统内部memcmp()
,这是我能想到的最简单的。虽然我没有发送asm-output来验证这一点,但它可能很好地优化了。
int i,j;
for (i=0; i<n; ++i)
{
for (j=0; j<n && !A[i][j]; ++j);
if (j == n)
break;
}
first_zero_row = (i < n ? i : -1);
基于VLA的解决方案可以提高足够大n
的性能,具体取决于优化程序的智能程度。如果系统具有memset
和memcmp
的合理智能内在函数,则以下可能的效果优于上述内容:
int find_zero_row(int n, int A[n][n])
{
int zeros[n], i;
memset(zeros, 0, sizeof(zeros));
for (i=0;i<n && memcmp(A[i], zeros, sizeof(zeros)); ++i);
return (i < n ? i : -1);
}
最后,虽然我意识到这是一个C问题,但是对于任何对使用模板函数的固定数组C ++解决方案感兴趣的人,我都包括以下内容。如果std::memcmp
是一个写得很好的内在函数,则以下优化 :
template<int N>
int find_zero_row(int (&A)[N][N])
{
static const int zeros[N] = {};
int i=0;
for (; i<N && std::memcmp(A[i], zeros, sizeof(zeros)); ++i);
return (i < N ? i : -1);
}
答案 2 :(得分:0)
int first_zero_row = -1;
int i, j;
for(i = 0; i < n; i++) {
first_zero_row = i;
for(j = 0; j < n; j++){
if(A[i][j]) {
first_zero-row = -1;
break;
}
}
if (first_zero_row != -1) break;
}
是否有一种可能性超出我的头脑
答案 3 :(得分:-1)
memcmp速度更快。像
这样的东西emptyRow [4] = {0}; Rowlen = 4 * sizeof(elem);
for(i = 0; i < n; i++)
{
if (memcmp(A[i][0], emptyRow, Rowlen))
{
}
}