用C程序求一个m*n矩阵,要求矩阵元素为0或1,而且每列之和为1;当第i行不为0是必须有第i行第i列元素为1

2024-11-28 16:55:36
推荐回答(1个)
回答1:

伪代码:

for 有1的行数 1 to m
for 每一个行组合方式
从左到右迭代,把取值为零敬盯的行的1移到行号较小的取值为1的行上

具体一点的伪代码:
int s[m]={0};int rectangular[m][n];
void utility(int p)
{
if(p>m-1) {show();return;}
if(s[p]==1){ rectangular[p][p]=1;utility(p+1);}
else{
for(int i=p-1;i>=0;--i)
{
if(s[i]==1)
{
int temp[m][n]=rectangular;// 这儿省略亮余和实现
rectangular[m][top(m)]=1;utility(p+1);
rectangular=temp;}
}
}
}
void handle()
{
//本函数用来处理行取1 已经选好之后的工作
init();// 这个函数 初始化矩阵 所有元素设零 此处省略
utility(0);
}
void f(int startPosition,int lineSize)
{
//这儿用了递归,可以使用动态规划思想来优化
if(m-startPosition==lineSize)
{ for(int i=startPosition;i!=m;++i)
s[i]=1;
handle();
return;
}
if(lineSize==0)
{ handle();return;}
f(startPosition+1,lineSize-1);
f(startPosition+1,lineSize);
}
void main()
{
for(int i=1;i!=m+1;++i)
{
f(1,i-1);//注毁顷意第一行 一定有1
}
}