伪代码:
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
}
}