C++一个求鞍点的程序,有几个问题,请高手解答

鞍点就是指在矩阵中,每行最大的数与每列最小的数字(不知道有没有搞混,就按照这个定义做题吧)

思路:创建一个二维数组,以每两行为一个单位,第一行存放的是每行最大的数的行下标,第二行存放的是 每行最大数字的列下标,(这样以来,这个二维数组的两列就可以表示矩阵每行最大的数),同理,第三,第四行分别存放的是 矩阵中每列的最小数的行下标和列下标;然后通过循环比较,(此时,二维数组里的都是每行最大的数字与每列最小的数字的信息),如果,最大与最小是矩阵的同一个元素,那么输出它是鞍点:实现:既然元素相同,那么每行最大数的列下标与每行最小数的列下表一定相同,先找到,列下标与列下标都相同的元素,然后判断这两个元素的行下标是否相等即可;
代码如下:
# include<iostream>
using namespace std;
int main()
{

int a[10][10];
int b[10][100];

int t;
cout<<"一共有多少组测试数据\n";
cin>>t;
int n;
int i,j,i1=0,j1=0,j2=0,j3=0,j4=0;

for(;t>0;t--)
{
memset(b,0,1000);//清空数组内容
memset(a,0,100);//清空数组内容

cout<<"多少阶矩阵?\n";
cin>>n;

cout<<"请输入"<<n*n<<"个数据\n";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];

int cankao;
for(i=0;i<n;i++)//将元素的上下标列成一个数表
{
cankao=a[i][0];
for(j=0;j<n;j++)
{

if(a[i][j]>cankao)
{
cankao=a[i][j];//每一行的最大值
}
}

for(j=0;j<n;j++)
if(cankao==a[i][j])//如果是每一行的最大值,记录下它的行,列下标
{
b[0][j1++]=i; //第一行为行下标
b[1][j2++]=j;//第二行为列下标
}
}

//将每一列的最小的数的下标记录下来;
for(j=0;j<n;j++)
{
cankao=a[0][j];
for(i=0;i<n;i++)
{

if(cankao>a[i][j])
cankao=a[i][j];
}

for(i=0;i<n;i++)
if(a[i][j]==cankao)
{
b[2][j3++]=i;//第三行为每一列最小数的行下标
b[3][j4++]=j;//每一列最小数的列下标
}
}

for(j=0 ; b[1][j]!=null; j++)//由于不知道每行到底有多少个最大的数和最小的数,只能用b[1][j]!=null来控制了(每行最大数也有可能有多个)
{

for(j1=0; b[3][j1]!=null ;j1++)
if(b[1][j]==b[3][j1])
if(b[0][j]==b[2][j1])
{ cout<<"鞍点为\n";
cout<<"行下标为:"<<b[0][j]<<" "<<"列下标为:"<<b[2][j1]<<" "<<"数据为"<<a[ b[0][j] ][ b[2][j1] ]<<endl;
}

}
cout<<"********************\n";
}
return 0;
}
这个程序实在VC下编写的,有很多问题,:
第一;在字符数组中 用memset(a,0,n),可以实现清空数组,可是在int形的数组中,memset不就会使整个数组的值变成0了吗,就不是空值了,怎么使它变成空值?
第二;程序上本身也有问题,第二三次不输出东西

应该是memset(&a[0][0],0,n * sizeof(int));。我发以个给你(C写的)。

#include<stdio.h>
#define M 4
#define N 4

int andian(int (*p)[N],int *x,int *y) {
int i,j,k,doubtful,flag;
int saddle_row,saddle_col;
for(i = 0;i < M;i++) {
doubtful = p[i][0];
saddle_row = i;
saddle_col = 0;
for(j = 1; j < N; ++j) { // 找到第i行中最大的元素,并记录列索引
if(p[i][j] > doubtful) {
doubtful = p[i][j];
saddle_col = j;
}
}
flag = 1;
for(k = 0; (k < M) && (flag); ++k) { // 确认该数是否为所在列中最小的
if(p[k][saddle_col] < doubtful) {
flag = 0;
break;
}
}
if(flag) {
*x = saddle_row;
*y = saddle_col;
return 1;
}
}
return 0; 
}

void main() {
int a[M][N] = {5,1,2,3,8,3,6,1,12,4,10,6,10,8,7,9};
int x,y,i,j;
for(i = 0;i < M;i++) {
for(j = 0;j < N;j++)
printf("%3d",a[i][j]);
printf("\n");
}
if(andian(a,&x,&y)) printf("鞍点:a[%d][%d] = %d\n",x,y,a[x][y]);
else printf("鞍点不存在!\n"); 
}

追问

谢谢你的回答,只是离我想要的回答有点远

温馨提示:答案为网友推荐,仅供参考
相似回答