一、打擂台算法(求矩阵最值)
有一个3×4矩阵,求出值最大的那个元素的值,以及其所在的行号和列号。
代码如下:
#include <stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};//定义数组并赋值
int i,j,max,maxi=0,maxj=0;
max=a[0][0];
for(i=0;i<=2;i++)
{
for(j=0;j<=3;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxi=i;
maxj=j;
}
}
}
printf("最大值为:%d\n行号为:%d\n列号为:%d\n",max,maxi,maxj);
return 0;
}
二、求转置矩阵
具体为:输入一个4×4整数矩阵,然后将之转置并显示转置后的矩阵。
输入例子为:
1 0 2 4
2 0 0 4
1 3 5 7
1 1 1 0
#include <stdio.h>
#define SIZE 4
int main()
{
int data[SIZE][SIZE],T[SIZE][SIZE],i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
scanf("%d",&data[i][j]);
}
}//输入矩阵的值
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
T[i][j]=data[j][i];
}
}//转置
for(i=0;i<SIZE;i++)
{
printf("\n");
for(j=0;j<SIZE;j++)
{
printf("%5d",T[i][j]);
}
}//输出
return 0;
}
三、求对角线元素和
求一个3×3的整型矩阵对角线元素之和。
#include <stdio.h>
#define N 3
#define M 3
int main()
{
int a[N][M],i,j,sum=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<N;i++)
{
sum+=a[i][i];
}
printf("%d",sum);
return 0;
}
四、鞍点与马鞍点(行上最小,列上最大)
题目:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
输入样例1:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
输出样例1:
a[0][4]=5
输入样例2:
1 2 3 4 11
2 4 6 8 12
3 6 9 10 15
4 8 12 16 7
输出样例2:
It is not exist!
(无鞍点)
由题意可知:一个二维数组最多有一个鞍点,也可能没有鞍点。
两种解题思路,但大体上还是一样的:
(1)先找出一行中值最大的元素,然后检查它是否为该列中的最小值,如果是,则是鞍点,输出;如果不是,再找下一行的最大数再检查它是否为该列的最小值,如果每一行的最大数都不是鞍点,则此数组无鞍点。
(2)找出每一行的最大值,同时也找出每一列的最小值,判断第i行和第j列的值是否相等。
代码如下:
(1)
#include <stdio.h>
#define N 4
#define M 5
int main()
{
int i,j,k,max,row,column;
int a[N][M],flag;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<N;i++)
{
max=a[i][0];//开始时设a[i][0]最大
column=0;
for(j=0;j<M;j++)
{
if(a[i][j]>max)
{
max=a[i][j];//找出本行最大值并存放在max中
column=j;//将最大数所在的列存放在column中
}
}
flag=1;//假设它其是鞍点,并以flag=1为代表
for(k=0;k<M;k++)
{
if(max>a[k][column])//将最大数与同列元素相比
flag=0;//如果max不是最小值,表示它不是鞍点,令flag=0
continue;
}
if(flag)//如果flag为1表示它是鞍点
{
printf("a[%d][%d]=%d\n",i,column,max);//输出鞍点的值及所在的行列号
break;
}
}
if(!flag)
{
printf("It is not exit!\n");
}
return 0;
}
(2)
#include <stdio.h>
#define m 4
#define n 5
void Getsaddle(int A[m][n])
{
int i,j,min[n],max[m];
for(i=0;i<m;i++)
{
max[i]=A[i][0];
for(j=0;j<n;j++)
{
if(A[i][j]>max[i])
{
max[i]=A[i][j];
}
}
}//找每一行的最大值
for(j=0;j<n;j++)
{
min[j]=A[0][j];
for(i=0;i<m;i++)
{
if(A[i][j]<min[j])
min[j]=A[i][j];
}
} //找每一列的最小值
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(max[i]==min[j])//判断第i行和第j列的值是否相等
printf("a[%d][%d]=%d\n",i,j,max[i]);
}
}
}
int main()
{
int a[m][n],i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
Getsaddle(a);
return 0;
}
如果是求马鞍点的话换一下 i, j位置即可。