求教:C语言求矩阵的鞍点问题
// 下面是你的代码 我加了个 注释
#include stdio.h
void main()
{
while(1)
{
int a[4][4];
int j,i,m,t,x,y;
printf(“please input sixteen numbers:\n”);
for(j=1;j=4;j++)
for(i=1;i=4;i++)
scanf(“%d”,a[j-1][i-1]);
printf(“\n”);
for(j=1;j=4;j++)
{
if(a[j-1][0]=a[j-1][1])
m=a[j-1][0];
else
m=a[j][1]; // 这里出问题了 应该是 m = a[j-1][1];
for(i=3;i=4;i++)
if(a[j-1][i-1]=m)
m=a[j-1][i-1];
for(x=1;x=4;x++)
{
if(a[j-1][x-1]==m)
{
if(a[0][x-1]=a[1][x-1])
t=a[0][x-1];
else
t=a[1][x-1];
for(y=3;y=4;y++)
if(a[y-1][x-1]=t)
t=a[y-1][x-1];
if(m==t)
printf(“此数列的鞍点为元素a[%d][%d],对应数值大小为 %d\n”,j-1,x-1,m);
}
}
}
}
}
用C语言编辑 鞍点计算
额,这题前不久刚答过。。。
蒽,楼上的,本来确实没那么复杂,但是若是自定义矩阵大小,再加上防错处理,还有再考虑上一个矩阵中鞍点不止一个(如4*4矩阵例子:
1 2 4 4
2 3 5 6
3 4 6 7
4 5 7 8
此时鞍点就有两个,是第一行的第三列和第四列)
我的算法思想是这样的:先找出各行的最大值在数组中相对第一个元素的距离(如上面的4*4矩阵,8相对第一个元素1的距离为3*4+3=15),存储在一个数组中。再找出各列的最小值在数组中相对第一个元素的距离,也存储在另一个数组中。最后比较这两个数组,如果有相等的值,说明这个元素就是鞍点了,这算法也可以完美解决有多个鞍点的数组。
#include stdio.h
#define MAX_SIZE 100 //最大长度
struct node { //用来存储所有行的最大值或所有列的最小值的所在元素在矩阵中的位置
int num[MAX_SIZE * MAX_SIZE];
int len; //当前num数组存储数据的长度(length)
};
int main() {
int hang,lie; //行,列
int arrays[MAX_SIZE][MAX_SIZE];
int i,j,flag,min_i,max_j; //flag标记矩阵有无鞍点
struct node max, min;
printf(“此为为矩阵找鞍点程序!\n”);
printf(“请输入行和列的大小(用空格分开,且不超过%d):\n”,MAX_SIZE);
scanf(“%d%d”,hang,lie);
while((hang MAX_SIZE) || (lie MAX_SIZE) || (hang = 0) || (lie = 0)) { //防错处理,增强程序健壮性
printf(“行或列的大小不合法,请重新输入:\n”);
scanf(“%d%d”,hang,lie);
} //while
for(i = 0; i hang; i++) {
printf(“请输入第%d行元素(用空格分开):\n”,i+1);
for(j = 0; j lie; j++) {
scanf(“%d”,arrays[i][j]);
} //for
} //for
printf(“**********************************\n”);
printf(“您输入的矩阵为:\n”);
for(i = 0; i hang; i++) {
for(j = 0; j lie; j++) {
printf(“%-4d”,arrays[i][j]);
} //for
printf(“\n”);
} //for
max.len = 0;
for(i = 0; i hang; i++) { //找出行的最大值
max_j = 0;
for(j = 1; j lie; j++) {
if(arrays[i][max_j] arrays[i][j]) { //找出该行第一个最大元素所在列的下标max_j
max_j = j;
} //if
} //for
max.num[max.len++] = i * lie + max_j;
for(j = max_j+1; j lie; j++) { //找出该行其他最大值,并将其位置存储在max.num数组中
if(arrays[i][j] == arrays[i][max_j]) {
max.num[max.len++] = i * lie + j;
} //if
} //for
} //for
min.len = 0;
for(j = 0; j lie; j++) { //找出列的最小值
min_i = 0;
for(i = 1; i hang; i++) {
if(arrays[min_i][j] arrays[i][j]) { //找出该列第一个最小元素所在行的下标min_i
min_i = i;
} //if
} //for
min.num[min.len++] = min_i * lie + j;
for(i = min_i+1; i hang; i++) { //找出该列其他最小值,并将其位置存储在min.num数组中
if(arrays[i][j] == arrays[min_i][j]) {
min.num[min.len++] = i * lie + j;
} //if
} //for
} //for
flag = 0; //先假设该矩阵无鞍点
for(i = 0; i max.len; i++) { //比较max和min矩阵中有无相同的值
for(j = 0; j min.len; j++) {
if(max.num[i] == min.num[j]) {
flag = 1; //说明该矩阵有鞍点
min_i = max.num[i] / lie;
max_j = max.num[i] % lie;
printf(“\n鞍点位置: 第%d行第%d列\n”,min_i + 1,max_j + 1);
printf(“鞍点值为: %d\n”,arrays[min_i][max_j]);
} //if
} //for
} //for
if(!flag) { //说明矩阵无鞍点
printf(“该矩阵无鞍点!\n\n”);
} //if
printf(“**********************************\n”);
return 0;
} //main
C语言实验题——鞍点
#include “stdio.h”
#include “stdlib.h”
void main()
{
int a[100][100],n,m,max,min,k,i,j,h=0;
scanf(“%d%d”,n,m);
for(i=0;in;i++)
for(j=0;jm;j++)
scanf(“%d”,a[i][j]);
for(i=0;in;i++)
{
max=a[i][0];
for(j=0;jm;j++)
if(maxa[i][j])max=a[i][j];
for(j=0;jm;j++)
if(max==a[i][j])break;
min=a[i][j];
for(k=0;kn;k++)
if(mina[k][j])min=a[k][j];
if(max==min)
{printf(“Array[%d][%d]=%d\n”,i,j,max);h=1;}
}
if(h==0)printf(“None”);
}
C语言编程题,找鞍点
#includestdio.h
int main()
{
int a[4][4]={{2,3,9,5},{6,7,8,3},{0,5,7,5},{2,1,8,3}};
int i,j,k,i0,j0,find=0;
printf(“数组a:\n”);
for(i=0;i4;i++)
{
for(j=0;j4;j++)
printf(“%3d”,a[i][j]);
printf(“\n”);
}
for(i=0;i4;i++) //穷举所有的行
{
j0=0;
for(j=1;j4;j++)
if(a[i][j]a[i][j0])j0=j; //找到第i行上最大的数a[i][j0]
k=1;
for(i0=0;i04;i0++) //对找到的该数穷举所有行
if(a[i0][j0]a[i][j0])k=0; //如它不是本列上最小的数就“一票否决”
if(k) //若确认是,就输出,并记录已找到
{
printf(“鞍点是:a[%d][%d]=%d\n”,i,j0,a[i][j0]);
find=1;
}
}
if(!find) //若未找到,则输出提示信息
printf(“此数组无鞍点!\n”);
return 0;
}
C语言 一个二维数组中的鞍点是不是最多只有一个
鞍点可能不止一个,当然也有可能没有.
下例中:
133
255
789
第一行中的两个3,就都是鞍点.