数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现
#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;
#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;
}