#include<stdio.h>
int main()
{
int a[100][100],c[100],d[100]; // i行,j表示列
int i,j,n;
scanf("%d",&n); // 共有n行n列
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]); // 循环录入二维数组
}
}
for(i=0;i<n;i++)
{
int max=a[i][0]; // 假设每行最大数是该行第一列对应的那个数
c[i]=0; /*这里一定注意,给c[i]赋初值,否则一旦没有进入if判断,就不知道会算出什么鬼怪。 */
for(j=0;j<n;j++)
{
if(a[i][j]>max)
{
max=a[i][j]; //得到该行最大数
c[i]=j; // 把每行最大的数对应的列数存到一个新的数组里
//这样 行数和列数有了一 一对应关系
}
}
}
int k,flag,min;
for(i=0;i<n;i++)
/*外层循环的目的是,找出“该行最大”的那个数,并且我们假设这个数就是”该列最小“,也就是我们的min,.
内层循环的目的是,因为这里的”该行最大对应的那个数”我们已经确定了,只需看一下这个“该行最大“,是否也满足“该列最小” */
{
flag=0;
k=c[i];
min=a[i][k];
for(i=0;i<n;i++)
{
if(a[i][k]<min)
{
flag=1;
printf("sb\n"); //这个删掉就可以,只是为了验证数据
break;
}
}
if(flag==0)
{
printf("%d",min);
}
}
return 0;
}