问答题 在n×n(n≥3)阶的稀疏矩阵A中,只有下标满足1<i<n和n-i≤j≤n-i+2的元素A[i][j]不等于0,若这些非0元素按行优先的顺序存储在一维数组B中,编写一个算法通过B求A[i][j]之值。也就是说,在存在B的情况下已知i、j,求A[i][j]。
【正确答案】依题意,稀疏矩阵A按行优先顺序存放这些非0元素,可得到如下序列:
a2,n-2 a2,n-1 a2,n a3,n-3 a3,n-2 a3,n-1 ... an-1,1 an-1,2 an-1,3
把它们顺序存放在一维数组B中,前j-1行共有非0元素3x(i-2)个,在非0的ai,j前,本行还有非0元素的个数为j-(n-i)个,则ai,j在B中的位置为1+3×(i-2)+(i+j-n),也就是说,A[i][j]存放在B[1+3×(i-2)+(i+j-n)]元素中。
本题实现代码如下:
int value(int a[],int i,int j) //已知i,j返回A[i][j]之值
{
int add;
if(i>1 && i<n && j>=n-i && j<=n-i+2) //非0元素的条件
{
add=1+3*(i-2)+(i+j-n); //在B中的下标
return a[add];
}
else return 0;
}
void disp(int a[])
{
int i,j;
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
cout<<setw(3)<<value(a,i,j);
cout<<endl;
}
}
【答案解析】