鞍点就是指在矩阵中,每行最大的数与每列最小的数字(不知道有没有搞混,就按照这个定义做题吧)
思路:创建一个二维数组,以每两行为一个单位,第一行存放的是每行最大的数的行下标,第二行存放的是 每行最大数字的列下标,(这样以来,这个二维数组的两列就可以表示矩阵每行最大的数),同理,第三,第四行分别存放的是 矩阵中每列的最小数的行下标和列下标;然后通过循环比较,(此时,二维数组里的都是每行最大的数字与每列最小的数字的信息),如果,最大与最小是矩阵的同一个元素,那么输出它是鞍点:实现:既然元素相同,那么每行最大数的列下标与每行最小数的列下表一定相同,先找到,列下标与列下标都相同的元素,然后判断这两个元素的行下标是否相等即可;
代码如下:
# 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写的)。
谢谢你的回答,只是离我想要的回答有点远