假设2D [n][n]
矩阵仅包含1和0。任何一行中的所有1都应该在0之前。任何行i
中的1的数量应至少为1的行(i+1)
的数量。找到一个方法并编写一个c程序来计算2D矩阵中1的no。算法的复杂性应该是O(n)。
问题来自Cormen的算法手册,下面是我对这个问题的实现。请指出我的算法中的错误和/或建议更好的方法。谢谢!
#include <stdio.h>
#include <stdlib.h>
int **map;
int getMatrix();
main()
{
int n,i,j,t;
j=0;
n=getMatrix();
i=n-1;
int sum[n];
for(t=0;t<n;t++)
sum[t]=0;
int count=0;
while ( (i>=0) && (j<n) )
{
if ( map[i][j] == 1 )
{
j++;
count=count+1;
}
else
{
if (i==(n-1))
{
sum[i]=count;
count=0;
i--;
}
else
{
sum[i]=sum[i+1]+count;
count=0;
i--;
}
}
}
for (t=0;t<n;t++)
{
if ((t==(n-1)) && (sum[t]==0))
sum[t]=0;
else if ((sum[t]==0) && (sum[t+1]>0))
sum[t]=sum[t+1];
}
int s=0;
for (t=0;t<n;t++)
s=s+sum[t];
printf("\nThe No of 1's in the given matrix is %d \n" ,s);
}
int getMatrix()
{
FILE *input=fopen("matrix.txt","r");
char c;
int nVer=0,i,j;
while((c=getc(input))!='\n')
if(c>='0' && c<='9')
nVer++;
map=malloc(nVer*sizeof(int*));
rewind(input);
for(i=0;i<nVer;i++)
{
map[i]=malloc(nVer*sizeof(int));
for(j=0;j<nVer;j++)
{
do
{
c=getc(input);
}while(!(c>='0' && c<='9'));
map[i][j]=c-'0';
}
}
fclose(input);
return nVer;
}
答案 0 :(得分:1)
当您第一次描述您想要做的事情时,更容易找到问题。 无论如何,在我看来,你有一个问题,你设置
i == (n-1),
在初始化阶段,每次你输入这个,如果statmnet是正确的你没有; t减少i,
if (i==(n-1))
{
sum[i]=count;
count=0;
**i--;**
}
else
{
sum[i]=sum[i+1]+count;
count=0;
i--;
}