这是一个关于输入一个二位数组的鞍点的程序
鞍点就是一行中最大一列中最小的点
#include<iostream>
#include<stdio.h>
using namespace std;
#define M 5
void main()
{
int a[M][M],an[M];
int m,n,flag=0,s=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
for(int j=1;j<M;j++)
{
if(a[i][j]>=a[i][j-1])
{
an[i]=a[i][j];
m=i,n=j;
}
else
{
an[i]=a[i][j-1];
m=i,n=j-1;
}
}
for(int k=0;k<M;k++)
{
if(an[i]<=a[k][n])
flag=1;
else
flag=0;
}
if(flag==1)
{
s++;
cout<<"第"<<s<<"个鞍点是a["<<m<<"]["<<n<<"]="<<an[i]<<endl;
}
if(s==0)
cout<<"此数列无鞍点!"<<endl;
}
}
----------------解决方案--------------------------------------------------------
我想说的是你的编程风格不好啊,看着眼花!不看了
----------------解决方案--------------------------------------------------------
#include<iostream>
#include<stdio.h>
using namespace std ;
#define M 5
void main()
{
int a[M][M],an[M];
int m,n,flag=0,s=0 ;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl ;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl ;
}
for(i=0;i<M;i++)
{
for(int j=1;j<M;j++)
{
if(a[i][j]>=a[i][j-1])
{
an[i]=a[i][j];
m=i,n=j ;
}
else
{
an[i]=a[i][j-1];
m=i,n=j-1 ;
}
}
for(int k=0;k<M;k++)
{
if(an[i]<=a[k][n])
flag=1 ;
else
flag=0 ;
}
if(flag==1)
{
s++;
cout<<"第"<<s<<"个鞍点是a["<<m<<"]["<<n<<"]="<<an[i]<<endl ;
}
if(s==0)
cout<<"此数列无鞍点!"<<endl ;
}
}
[此贴子已经被作者于2007-9-24 12:48:14编辑过]
----------------解决方案--------------------------------------------------------
[CODE]
#include<iostream>
using namespace std;
#define M 5
int get_max(int a[M][M],int i) /* 求第i行最大数下标 */
{
int j,index=0,tmp;
tmp=a[i][0];
for(j=1;j<M;j++)
{
if(a[i][j]>tmp)
{
tmp=a[i][j];
index=j;
}
else if(a[i][j]==tmp)
return -1;
}
return index;
}
int get_min(int a[M][M],int j) /* 求第j列最小数下标 */
{
int i,index=0,tmp;
tmp=a[0][j];
for(i=1;i<M;i++)
{
if(a[i][j]<tmp)
{
tmp=a[i][j];
index=i;
}
else if(a[i][j]==tmp)
return -1;
}
return index;
}
int main()
{
int a[M][M];
int i_index,j_index,count=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
i_index=get_max(a,i);
if(i_index<0)
{
cout<<i+1<<"行无鞍点!"<<endl;
continue;
}
j_index=get_min(a,i_index);
if(j_index<0)
{
cout<<i_index+1<<"列无鞍点"<<endl;
continue;
}
count++;
cout<<"第"<<count<<"个鞍点为:"<<a[j_index][i_index]<<endl;
}
return 0;
}
----------------解决方案--------------------------------------------------------
先谢谢三楼的帮我把程序重写了一遍,3Q
四楼的程序我运行了一遍,结果还是不对
不知道我的理解对不对:按点就是以行里最大,一列中最小的一个数。
四楼的函数分别定义的风格觉得不错,值得借鉴
----------------解决方案--------------------------------------------------------
程序改一了下,这次应该是对的了
[CODE]
#include <iostream>
#include <iomanip>
using namespace std;
#define M 4
int get_max(int a[M][M],int i) /* 求第i行最大数下标 */
{
int j,index=0,tmp,count=0;
tmp=a[i][0];
for(j=1;j<M;j++)
{
if(a[i][j]>tmp)
{
tmp=a[i][j];
index=j;
}
}
for(j=0;j<M;j++)
{
if(a[i][j]==tmp)
count++;
}
if(count>1)
return -1;
return index;
}
int get_min(int a[M][M],int j) /* 求第j列最小数下标 */
{
int i,index=0,tmp,count=0;
tmp=a[0][j];
for(i=1;i<M;i++)
{
if(a[i][j]<tmp)
{
tmp=a[i][j];
index=i;
}
}
for(i=0;i<M;i++)
{
if(a[i][j]==tmp)
count++;
}
if(count>1)
return -1;
return index;
}
int main()
{
int a[M][M];
int i_index,j_index,count=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
cout<<setiosflags(ios::left)<<setw(4)<<a[i][j];
cout<<endl;
}
for(i=0;i<M;i++)
{
i_index=get_max(a,i);
if(i_index<0)
{
cout<<i+1<<"行无鞍点"<<endl;
continue;
}
j_index=get_min(a,i_index);
if(j_index<0)
{
cout<<i_index+1<<"列无鞍点"<<endl;
continue;
}
count++;
cout<<"第"<<count<<"个鞍点为:"<<"a["<<j_index<<"]["<<i_index<<"]:"<<a[j_index][i_index]<<endl;
}
return 0;
}
[此贴子已经被作者于2007-9-25 13:40:37编辑过]
----------------解决方案--------------------------------------------------------
for(int j=1;j<M;j++)
{
if(a[i][j]>=a[i][j-1])
{
an[i]=a[i][j];
m=i,n=j;
}
else
{
an[i]=a[i][j-1];
m=i,n=j-1;
}
}
这段程序有问题.
假如一行的数据为: 5 1 2 3 4
结果:an[i]==4 m=i,n=4
建议改写成:
for(a[i]=a[i][0],m=i,n=0,int j=1;j<M;j++)
{
if(a[i][j]>a[i] )
{
an[i]=a[i][j];
m=i,n=j;
}
}
----------------解决方案--------------------------------------------------------
#include<iostream>
#include<stdio.h>
using namespace std;
#define M 4
void An()
{
int i,j,t,m,n,k,flag=0,count=0,a[M][M];
for(i=0;i<M;i++)
{
cout<<"输入第"<<i+1<<"行数字:"<<endl;
for(j=0;j<M;j++)
cin>>a[i][j];
cout<<endl;
}
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
t=a[i][0];
m=i;
n=0;
for(j=1;j<M;j++)
if(a[i][j]>t)
{
t=a[i][j];
m=i;
n=j;
}
for(k=0;k<M;k++)
if(t>a[k][n])
flag=1;
if(flag==0)
{
count++;
cout<<"第"<<count<<"个鞍点是:a["<<m<<"]["<<n<<"]="<<t<<endl;
}
else
cout<<"第"<<i+1<<"行无鞍点!"<<endl;
flag=0;
}
}
void main()
{
An();
}
----------------解决方案--------------------------------------------------------
6楼的程序我运行过了,OK
只是会反复输出同一个鞍点
7楼的意见不错
谢谢各位了
----------------解决方案--------------------------------------------------------