min=max;
c=b;
//从找到的最大值中的那一列找该列的最小值并存储其位置
for(k=0;km;k++)
{
if(mina[k][d])
{
min=a[k][d];
c=k;
}
}
//判断最大值和最小值的位置是否相同
if(b==c)
{
flag=1;
break;
}
}
//输出语句
if(flag==1)
printf("a[%d][%d] is %d\n",b,d,max);
else
printf("No saddle point!\n");
}
用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((hangMAX_SIZE) || (lieMAX_SIZE) || (hang = 0) || (lie = 0)) { //防错处理,增强程序健壮性
printf("行或列的大小不合法,请重新输入:\n");
scanf("%d%d",hang,lie);
} //while
for(i = 0; ihang; i++) {
printf("请输入第%d行元素(用空格分开):\n",i+1);
for(j = 0; jlie; j++) {
scanf("%d",arrays[i][j]);
} //for
} //for
printf("**********************************\n");
printf("您输入的矩阵为:\n");
for(i = 0; ihang; i++) {
for(j = 0; jlie; j++) {
printf("%-4d",arrays[i][j]);
} //for
printf("\n");
} //for
max.len = 0;
for(i = 0; ihang; i++) { //找出行的最大值
max_j = 0;
for(j = 1; jlie; 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; jlie; 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; jlie; j++) { //找出列的最小值
min_i = 0;
for(i = 1; ihang; 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; ihang; 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; imax.len; i++) { //比较max和min矩阵中有无相同的值
for(j = 0; jmin.len; j++) {
if(max.num[i] == min.num[j]) {
flag = 1; //说明该矩阵有鞍点
推荐阅读
- 网易动作卡牌游戏,卡牌游戏 网易
- 包含如何无经验做新媒体运营师的词条
- js查询mdb数据,js如何查询数据库
- word里怎么把字体变大,word里怎么把字体变大点
- linux系统的查询命令 linux系统查询命令工具
- qq空间照片怎么倒到u盘,空间照片怎么导入到u盘
- java时钟代码,java课程设计电子时钟代码
- 快手直播如何开启关注通知,快手直播如何开启关注通知声音
- php刷新数据 php刷新当前页面