注册 登录
编程论坛 C++教室

[求助]二维数组的鞍点

a8451727 发布于 2007-07-24 15:37, 1802 次点击

#include<iostream>

#include<iomanip>
using namespace std;
int main()
{
void array_sort(int array[][4]);
int i,j,
a[4][4]={4,2,3,1,5,6,7,8,16,9,10,11,12,13,14,15};
for(i=0;i<4;i++){
for(j=0;j<4;j++)
cout<<setw(8)<<a[i][j];
cout<<endl;
}

array_sort(a);
return 0;
}

void array_sort(int array[][4])
{
int i,j,a,row;
int max1=array[0][0],
max2=array[0][0],
max3=array[0][0];

for(i=0;i<4;i++){
for(j=0;j<4;j++)
if(array[i][j]>max1){
max1=array[i][j];//找出最大那个数
a=j; //记录行数
}
}

max2=array[0][a+1];//以MAX1的行数为列数
for(i=0;i<4;i++){
for(j=0;j<4;j++)
if(array[j][a]<max2){
max2=array[j][a]; //找出这列的最小数;
row=j; //记录该行数 --->这里,为什么保存不到 row=j ??
}
}

max3=array[row][1];//调试这里出错
for(i=0;i<4;i++){
for(j=0;j<4;j++)
if(array[row][j]>max3){ //对比该行,记录最大数
max3=array[row][j];
}
}

cout<<"max1:"<<max1<<endl
<<"max2:"<<max2<<endl
<<"max3:"<<max3<<endl;
if(max2==max3){ /。。。。。。。。对比
cout<<"最高鞍点是"<<max2<<endl;
}
else
cout<<"没有最高鞍点\n";
}



1 2 3 4 ------>4是鞍点

5 6 7 8

9 10 11 12

13 14 15 16


比如:1 先找到16是最大数(max1),然后记录max1在 array[i][j]的 a=j;
2 用array[][a]查找该列的最小数max2
3 在max2该行对比是否该数最大。

大家帮我看下哪错了?
为什么MAX2可以赋值,MAX3就有错误了呢?

题目是:找出一个二维数组的按点,即该位置上的元素在该行最大,在该列上最小的那个数(也可能没有鞍点);

[此贴子已经被作者于2007-7-24 19:34:09编辑过]

8 回复
#2
aipb20072007-07-24 15:58

你的过程似乎烦琐了点,不对吧!
也可能是我没看明白,你能说下你的思路吗?

题目是:找出一个二维数组的按点,即该位置上的元素在该行最大,在该列上最小的那个数(也可能没有鞍点);
可以只在每行搜索最大值,每列搜索最小值,比较就行了啊!

#3
a84517272007-07-24 16:15

改了,不知道能不能表达清楚

#4
a84517272007-07-24 16:21
或者你写个我参考下

[此贴子已经被作者于2007-7-24 16:23:30编辑过]


#5
aipb20072007-07-24 16:57

[CODE]#include <iostream>
#include <iomanip>
using namespace std;
#define MAX 4
int find(int a[][MAX]){
int max[MAX] = {0},min[MAX] = {0},i,j;

for (i = 0;i < MAX;++i){
int t = a[i][0];
for (j = 0;j < MAX;++j)
if (a[i][j] > t)
max[i] = j;
}

for (i = 0;i < MAX;++i){
int t = a[0][i];
for (j = 0;j < MAX;++j)
if (a[j][i] < t)
max[i] = j;
}

for (i = 0;i < MAX;++i)
if (max[min[i]] == i)
return a[min[i]][i];
return -9999; //不存在
}

int main(){
int a[MAX][MAX],k = 1;
for (int i = 0;i < MAX;++i){
for (int j = 0;j < MAX;++j){
a[i][j] = k++;
cout << setw(8) << a[i][j];
}
cout << endl;
}
cout << find(a) << endl;
return 0;
}[/CODE]

按我的思路写的,你参考下吧!

#6
a84517272007-07-24 19:00

再次感谢

#7
a84517272007-07-24 19:19
回复:(aipb2007)[CODE]#include #...

换个数组就不行了
你写那个,全是找的 a[0][max-1] 那里的
但换成这样呢。
1 2 8 4

5 6 7 3 ------> 7是鞍点

9 10 11 12

13 14 16 15

#8
aipb20072007-07-24 22:57
我的错。第二个for里。

for (i = 0;i < MAX;++i){
int t = a[0][i];
for (j = 0;j < MAX;++j)
if (a[j][i] < t)
max[i] = j; //这里是min[i] = j ;两次循环是copy的,这里就疏忽了,看结果也对就漏掉了
}
#9
a84517272007-07-24 23:18
哈哈 不错
谢谢了。
1