数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现

 #include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>
using namespace std;
void Input(int A[],int n)
{
    for(int i=0;i<n;i++)
    cin>> A[i] ;
    cout<<endl;
}


void Output(int A[],int n)
{
   for(int i=0;i<n;i++)
    cout<<A[i]<<setw(5);
    cout<<endl;
}


void Rerver(int A[],int n)///将原序列逆序
{
   int temp;
   if(n==0)
        return;
    else
    {
     for(int i=0;i<n/2;i++)
       {
           temp=A[i];
           A[i]=A[n-i-1];
           A[n-i-1]=temp;
       }
    }


}


void compact(int A[],int n)///将非0元素移动到数组a的前端
{
   int free=0;///追加0元素的位置
   for(int i=0;i<n;i++)
   {
      if(A[i]!=0)
      {
          if(free!=i)
          {
              A[free]=A[i];
              A[i]=0;
          }
          free++;
      }
   }
}


void reArrange(int A[],int B[],int n)///将a从1--n之间的元素从小到大排序然后存放到b数组中,并且返回元素的个数
{
    int free=0;///记录当前为空的位置
    for(int i=0;i<n;i++)
        B[i]=0;///这里是初始化b中的元素
    for(int i=0;i<n;i++)///先把a中1--n之间的元素依次按照大小放进b中,然后在进行循环判断b中位置是否为空,如是则向前移
    {
     if(A[i]>=1&&A[i]<=n)
        B[A[i]-1]=A[i];
    }
    for(int i=0;i<n;i++)///向前移动位置
    {
        if(B[i])
        {
          if(i!=free)
          B[i]=B[free];
          free++;
        }
    }
}


void fenjie(int A[],int B[],int C[],int n,int &b,int &c)
{


   b=0,c=0;
    for(int i=0;i<n;i++)
     cin>>A[i];
    for(int i=0;i<n;i++)
     {
        if(A[i]<0)
        B[b++]=A[i];
        else
        C[c++]=A[i];
     }
    for(int i=0;i<b;i++)
        cout<<B[i]<<setw(5);
        cout<<endl<<endl;
    for(int i=0;i<c;i++)
        cout<<C[i]<<setw(5);




}


void Maxlenght(int G[],int n,int &star,int &lenght)///求a中最长平台的长度和起始位置(要求是连续最长的平台)
{


  int i=0,len,t=0;
  lenght=0,star=0;///必须先初始化
  while(i<n)
  {
      len=1;///每循环完一次连续的元素时要重新置为1
      while(i<n&&G[i]==G[i+1])
           {
            len++;
            i++;
           }
      if(len>lenght)
      {
          lenght=len;
          star=t;
      }
      i++;
      t=i;
  }
}
///将数组A(a1,a2....am,b1,b2...bn)原地逆置(b1.b2....bn,a1,a2.....am)
void Exchange(int A[],int from,int to)///原地逆置,下标从零开始
{
    int temp;
    for(int i=0;i<(to-from+1)/2;i++)
    {
       temp=A[from+i];
       A[from+i]=A[to-i];
       A[to-i]=temp;
    }
}


void CRerver(int A[],int m,int n)
{
    Exchange(A,0,m+n-1);
    Exchange(A,0,n-1);///假设B为3个元素
    Exchange(A,n,m+n-1);
}
void Create(int ***H,int m,int n)///初始化,两个**表示二维数组,再加一个*表示地址
{
    *H=new int*[m]; ///初始一个m行n列的矩
    for (int i=0;i<m;i++)
    {
    (*H)[i]=new int[n];
    }
}


void INput(int **H,int m,int n)///输入矩阵
{


    for(int i=0;i<m;i++)
      {
           for(int j=0;j<n;j++)
            cin>>H[i][j];///输入矩阵
      }
}
void OUTput(int **H,int m,int n)
{
     for(int i=0;i<m;i++)
    {
       for(int j=0;j<n;j++)
       {
           if(j%2==0)
           {
              if(j==0)
              cout<<H[i][j];
              else
              cout<<setw(5)<<H[i][j];
           }
              else
              cout<<setw(5)<<H[i][j];
       }
        cout<<endl<<endl;
    }
}


void Saddle(int **H ,int m,int n)///找出矩阵第i行的最小值同时也是第j列的最大值,并且依次输出
{
    int min,found;
   for(int i=0;i<m;i++)
    {


         min=0;///作为第一元素进行比较
         for(int j=1;j<n;j++)///先找行中的最小值
        {
            if(H[i][j]<H[i][min])
                min=j;
        }
        found=1;
       for(int k=0;k<m;k++)///去找列中的最大
        {
           if(H[k][min]>H[i][min])
            found = 0;
        }
        if(found==1)   ///既满足行中最大也满足列中最小
        cout<<H[i][min]<<setw(5);


    }
        if(found==0)
        cout<<"没有这个鞍点"<<endl;
}


void LaTin(int **H,int m,int n)///编写一个算法输出一个拉丁方阵
{
       m=n;
    for(int i=0;i<m;i++)
      for(int j=0;j<m;j++)
      {
        if(i+j<m)
        H[i][j]=i+j+1;///打出上三角
        else
        H[i][j]=i+j+1-m;///打出下三角
      }
}


void Snack(int **H,int m,int n)///编写一个算法输出一个蛇形矩阵,按照路线走就不会错
{
    m=n;
   int j,row,col,temp=1;///记录每条斜线的个数
   for(int k=1;k<=2*m-1;k++)///以对角线作为行,斜着打出路径,先计算每条斜线的个数
   {
       if(k<=m)
       j=k;///计算上三角的个数
       else
       j=2*m-k;///计算下三角的个数
       for(int i=0;i<j;i++)///把斜路径作为列打出
       {
           if(k<=m)///上三角
           {
               if(k%2!=0)
               {
                 row=k-i-1;
                 col=i;///按照路线走,我们发现列是递增的
               }
                else
               {
                row=i;
                col=k-i-1;
               }
           }
           else
           {
             if(k%2==0)
             {
                row=k-m+i;
                col=k-row-1;
             }
             else
             {
                col=k-n+i;
                row=k-col-1;
             }
           }
          H[row][col]=temp;
          temp++;
       }


   }
}


void Spiral(int **H,int m,int n)///螺旋矩阵的输出,按照路线来走
{
   int flag=0,i,j;///0表示向下,1表示向右,2表示向上,3表示向左
    m=n;
   for(i=0;i<m;i++)///进行对矩阵的初始化
    for(j=0;j<n;j++)
      H[i][j]=0;
      i=0,j=0;
    for(int temp=1;temp<=m*n;temp++)///这个是按照路线一次打出的数字
    {
       H[i][j]=temp;


       if(flag==0)///向下输出
       {
         if(i+1<m&&H[i+1][j]==0)
         i++;
         else
         flag=1;
       }
       if(flag==1)///向右输出
       {
         if(j+1<m&&H[i][j+1]==0)///所以此时这里是j+1
         j++;
         else
         flag=2;
       }
       if(flag==2)///向上输出
       {
         if(i-1>=0&&H[i-1][j]==0)
         i--;
         else
         flag=3;
       }
       if(flag==3)///向左输出
       {
         if(j-1>=0&&H[i][j-1]==0)
         j--;
         else
         {
          i++;///注意,这里末尾一定要i++,思想很重要
          flag=0;
         }
       }
    }
}
int main()
{
    int A[5],B[8],C[8],b,c, D[8],E[8],F[8],G[5],star,lenght;
    Input(A,5);
    Output(A,5);
    cout<<endl<<"输出原序列逆序后为:";
    Rerver(A,5);
    Output(A,5);
    cout<<endl<<"将非0元素移动到数组a的前端:";
    compact(A,5);
    Output(A,5);
    cout<<"请输入8个大于0的数:";
    Input(C,8);
    reArrange(C,B,8);
    Output(B,8);
    cout<<"请输入8个数:";
    fenjie(D,E,F,8,b,c);
    cout<<endl<<"b的个数为:"<<b<<setw(20)<<"c的个数为:"<<c<<endl<<endl;
    cout<<"请输入5个数可以为重复连续的:";
    Input(G,5);
    Maxlenght(G,5,star,lenght);
    cout<<endl<<"star为:"<<star<<setw(19)<<"lenght为:"<<lenght<<endl<<endl;
    CRerver( A,2,3);
    Output(A,5);
    int **H=NULL;
    Create(&H,5,5);///切记,这里一定要加引用,表示地址
    cout<<"请输入你需要输的矩阵:";
    INput(H,5,5);
    cout<<"输出刚刚你输入的二维动态数组转换为如下的矩阵:"<<endl<<endl;
    OUTput(H,5,5);
    cout<<"输出的这个矩阵是否有鞍点的结果如下:";
    Saddle(H,5,5);
    Create(&H,10,10);
    cout<<endl<<endl<<"输出的拉丁方阵为如下:"<<endl;
    LaTin(H,10,10);
    OUTput(H,10,10);
    Create(&H,10,10);
    cout<<endl<<endl<<"输出的蛇形矩阵为如下:"<<endl;
    Snack(H,10,10);
    OUTput(H,10,10);
    Create(&H,10,10);
    cout<<endl<<endl<<"输出的螺旋形矩阵为如下:"<<endl;
    Spiral(H,10,10);
    OUTput(H,10,10);
    return 0;

}

数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现

数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现

数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现

数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现

数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现