第【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)节 矩阵运算

 

 

 

 

 

 

 

 

posted @ 2019-12-03 20:40  浪波激泥  阅读(217)  评论(0编辑  收藏  举报