第【4】章: 多维数组与矩阵 学习报告
(4.1)节: 顺时针打印二维数组
1、题干:构建二维数组,按照顺时针的方向打印
2、解题思路:不断对数组的外围进行打印,外围不断变小。
3、关键代码:
int H=0,L=1;//最大行列坐标 ,根据实际定值
int h=0,l=0;//起始行列坐标
int i=h,j=l;
while(l<=L||h<=H)
{
while(j<=L)///打印第一行
{cout<<a[i][j]<<" ";
j++;
}
j--;h++;i=h;
cout<<endl;
while(i<=H&&l<=L)///打印最后一列
{cout<<a[i][j]<<" ";
i++;
}
i--;L--;j=L;
cout<<endl;
while(j>=l&&h<=H)//打印最后一行
{cout<<a[i][j]<<" ";
j--;
}
j++;H--; i=H;
cout<<endl;
while(i>=h)//打印第一列
{cout<<a[i][j]<<" ";
i--;
}
i++;l++;j=l;
cout<<endl;
}
(4.2)节: 0所在的行列清0
1、题干:
2、解答思路:要避免边扫描边清0,要先扫描后记录0所在的行和列,再清0
3、关键代码:
struct str
{int H,L;
}a[10];
int k=0;
int t[5][5]={1,2,3,4,5,
2,0,5,7,3,
1,7,0,8,6,
7,8,9,3,2,
2,4,5,6,7,};
void out(int h,int l)
{for(int i=0;i<=l;i++)
{ for(int j=0;j<=h;j++)
cout<<t[j][i]<<" ";
cout<<endl;
}//输出原来数组
for(int i=0;i<=l;i++)
for(int j=0;j<=h;j++)
if(t[j][i]==0)
{ a[k].H=i;a[k].L=j; k++; }//记录0的位置
for(int i=0;i<k;i++)
for(int j=0;j<=h;j++)
t[a[i].L][j]=0;///////////////列0
for(int i=0;i<k;i++)
for(int j=0;j<=l;j++)
t[j][a[i].H]=0;//////////////行0
cout<<endl; cout<<endl;
for(int i=0;i<=l;i++)
{ for(int j=0;j<=h;j++)
cout<<t[j][i]<<" ";
cout<<endl;
}//输出新的数组
}
(4.3)节: Z形打印二维数组
1、题干:
2、解答思路:上坡的,斜上斜下不可以走,右可以就走右,不行就走下,下坡的,斜上斜下不可以,下可以的就走下,不行就走右,
3、关键代码:
int num [3][5]={{11,12,13,14,15},
{21,22,23,24,25},
{31,32,33,34,35},
};
int H=2,L=4;//边界
int h=0,l=0;//所在位置
int t=1;//判断上坡还是上坡
while(true)
{
//上坡h--,l++
cout<<num[h][l]<<" ";
if(h-1>=0&&l+1<=L&&t==1)//上斜可以走
{h--;l++;}
else if(h-1<0&&l+1<=L&&t==1)//右
{l++; t=0; }
else if(h-1<0&&l+1>L&&t==1)
{h++;t=0; }//下
//下坡
else if(h+1<=H&&l-1>=0&&t==0)//下斜
{h++;l--; }
else if(l-1<0&&h+1<=H&&t==0) //下
{h++;t=1; }
else if(h+1>H&&l+1<=L&&t==0)//右
{l++;t=1; }
else
break;//到达终点
}
(4.4)节: 边界为1的最大矩阵
(4.5)节: 边界为1的最大矩阵优化(上)
(4.6)节: 边界为1的最大矩阵优化(下)
1、题干:
(4.7)节 子数组最大累加和
1、题干:
2、解答思路:题意要求我们找出和最大的子数组,我们可以让前面相加,如果前面和小于0,那么前面就可以作为一个边界,然后找出最大的sun
3、关键代码:
int sun=a[0];
int max=a[0];
int l=0,r=0;
for(int i=1;i<10;i++)
{
if(sun>=0)
sun=sun+a[i];
else {sun=a[i];l=i;}
if(sun>max)
{max=sun;
r=i;
}
}
(4.9)节 矩阵运算