一、几个矩阵类问题
1. m*n矩阵转置
(1)就地转置:针对m=n的情况,此时矩阵为方阵
源代码:
#include <stdio.h>
#define maxn 50
void trans(int a[][maxn],int n) //就地转置矩阵
{
int i,j;
int temp;
for(i=0;i<n;i++) //仅需处理矩阵下三角部分
{
for(j=i+1;j<n;j++)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
}
void output(int a[][maxn],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
int main()
{
int a[maxn][maxn];
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
trans(a,n);
output(a,n);
}
return 0;
}
程序截图:
(2)借助数组转置:针对一般情况
源代码:
#include <stdio.h>
#define maxn 50
void trans(int a[][maxn],int b[][maxn],int m,int n) //借助数组转置矩阵
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
b[j][i]=a[i][j];
}
}
void output(int b[][maxn],int m,int n)
{
int i,j;
for(j=0;j<n;j++)
{
for(i=0;i<m;i++)
printf("%d ",b[j][i]);
printf("\n");
}
}
int main()
{
int a[maxn][maxn],b[maxn][maxn];
int i,j,m,n;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
trans(a,b,m,n);
output(b,m,n);
}
return 0;
}
程序截图:
2. 找出二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小
源代码:
#include <stdio.h>
#define maxn 50
void FindNode(int a[][maxn],int m,int n)
{
int i,j,k,Node;
int flag1=1,flag2=0,lnindex;
for(i=0;i<m;i++)
{
Node=a[i][0];
for(j=1;j<n;j++)
{
if(a[i][j]>Node)
{
Node=a[i][j];
lnindex=j;
}
}
for(k=0;k<m;k++)
{
if(a[k][lnindex]<Node)
{
flag1=0;
break;
}
}
if(flag1==1)
{
flag2++;
printf("a[%d][%d]=%d\n",i,lnindex,Node);
}
}
if(flag2==0)
printf("无鞍点\n");
}
int main()
{
int a[maxn][maxn],m,n;
int i,j;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
FindNode(a,m,n);
}
return 0;
}
程序截图:
3. 输出n阶“魔方阵”
源代码:
#include <stdio.h>
#define maxn 50
void CreateMatrix(int a[][maxn],int n)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
j=n/2;
a[0][j]=1;
for(k=2;k<=n*n;k++)
{
i-=1;
j+=1;
if((i<0) && (j>n-1))
{
i+=2;
j-=1;
}
else
{
if(i<0)
i=n-1;
if(j>n-1)
j=0;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i+=2;
j-=1;
a[i][j]=k;
}
}
}
void Output(int a[][maxn],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][n-1]);
}
}
int main()
{
int a[maxn][maxn],n;
while(scanf("%d",&n)!=EOF)
{
if((n!=0) && (n<=maxn) && (n%2!=0))
{
CreateMatrix(a,n);
Output(a,n);
}
else
printf("Please input again!\n");
}
return 0;
}
程序截图: