您的位置:首页 > 理论基础 > 数据结构算法

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

2017-07-24 08:21 639 查看
 #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....a
4000
m,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
;

    }

}

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;
}









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: