关于#c语言#的问题:输出它的行列下标,输出NO输入格式:第一行输入n第二行开始输入n阶方阵,数值间空格隔开

题目:
找出一个n(由键盘输入,1<=n<=6)阶方阵(整数)中的鞍点(值在该行上最大 ,在该列上最小的元素称为鞍点)。如果找到鞍点,输出它的行列下标,没有鞍点,输出NO

输入格式:
第一行输入n

第二行开始输入n阶方阵,数值间空格隔开。

输出格式:
若存在靶点,输出靶点的行列下标(空格隔开);否则输出NO。

输入样例:
在这里给出一组输入。例如:

3
1 3 5
2 4 6
3 9 12
输出样例:
在这里给出相应的输出。例如:

0 2
结尾无空行

我的代码:
#include <stdio.h>

int main()
{
    int a,o=0;
    scanf("%d\n", &a);
    int k[a][a];
    for (int i = 0; i<a; i++)
    {
        for (int j = 0; j<a; j++)
        {
            scanf("%d", &k[i][j]);
        }
    }
    int xmax, ymax;
    for (int i = 0; i<a; i++)
    {
        for (int j = 0; j<a; j++)
        {
            xmax = k[i][0];
            if (xmax < k[i][j])
                xmax = k[i][j];
        }
        int q;
        for (int t = 0; t<a; t++)
        {
            int j;
            if (xmax == k[i][t])
            {
                q = t;
            }
            for (int z = 0; z<a; z++)
            {
                ymax = k[0][q];
                if (ymax>k[z][q])
                    ymax = k[z][q];
            }
        }
         if (ymax == xmax)
         {printf("%d %d", i, q);break;}
            else
                o+=1;
    }
    if(o==a)
    { printf("NO");}
    return 0;
}

为什么无靶点的测试点一直没过,求解

xmax = k[i][0];要放在 for (int j = 0; j<a; j++)循环之前
ymax = k[0][q];也是一样

#include <stdio.h>

int main()
{
    int a,i;
    scanf("%d\n", &a);
    int k[a][a];
    for (i = 0; i<a; i++)
    {
        for (int j = 0; j<a; j++)
        {
            scanf("%d", &k[i][j]);
        }
    }
    for (i = 0; i<a; i++)
    {
        int q = 0;
        for (int j = 1; j<a; j++)
        {
            if (k[i][q] < k[i][j])
                q = j;
        }
        int p;
        for (p = 0; p<a; p++)
        {
            if (k[i][q] > k[p][q])
                break;
        }
        if (p>=a)
        {
            printf("%d %d", i, q);
            break;
        }
    }
    if(i>=a)
        printf("NO");
    return 0;
}

C不能用变量做数组大小,int k[a][a];改成int k[6][6];
xmax = k[i][0];要放在第一层for循环,不能在第二层for循环。
if(o==a)应该是 if(o==0)
代码修改如下:

#include <stdio.h>

int main()
{
    int a,o=0;
    scanf("%d\n", &a);
    int k[6][6];
    for (int i = 0; i<a; i++)
    {
        for (int j = 0; j<a; j++)
        {
            scanf("%d", &k[i][j]);
        }
    }
    int xmax, ymax;
    for (int i = 0; i<a; i++)
    {
        //找行最大值
        xmax = k[i][0];
        int q = 0;
        for (int j = 0; j<a; j++)
        {
            if (xmax < k[i][j])
            {
                xmax = k[i][j];
                q = j; //q记录列下标
            }
        }
        //判断是否是列最小
        int flag = 0;
        for (int t = 0; t<a; t++)
        {
            if (k[t][q] < k[i][q])  // k[i][q]就是第i行的最大值
            {
                flag = 1; //有更小的数
                break;
            }
        }
        if (flag == 0)
        {printf("%d %d\n", i, q);o+=1;break;}
        
    }
    if(o==0) //数量等于0,输出NO
    { printf("NO");}
    return 0;
}