天天看點

#C語言:尋找鞍點,給出所有鞍點的行 列下标

一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。

本題要求編寫程式,求一個給定的n階方陣的鞍點。

輸入格式:

輸入第一行給出一個正整數n(1≤n≤6)。随後n行,每行給出n個整數,其間以空格分隔。

輸出格式:

輸出在一行中按照“行下标 列下标”(下标從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點

#include<stdio.h>
int main()
{
	int n,i,j,count=0;
	scanf("%d",&n);
	int a[n][n];
    int b[n][n];//聲明一個輔助數組
	
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
            b[i][j]=0;//令輔助數組都為0
		}
	}
	
	int x;


	for(i=0;i<n;i++)
	{
		x=0;
		for(j=1;j<n;j++)
		{
			if(a[i][j]>a[i][x])
			x=j;
		}//找到行中最大值下标
        for(j=0;j<n;j++)
        {
            if(a[i][j]==a[i][x])
            b[i][j]++;
        }//讓所有的最大值都加一
	}
    	for(i=0;i<n;i++)
	{
		x=0;
		for(j=1;j<n;j++)
		{
			if(a[j][i]<a[x][i])
			x=j;
		}//找到列中最小值下标
        for(j=0;j<n;j++)
        {
            if(a[j][i]==a[x][i])
            b[j][i]++;
        }//讓所有的最小值都加一
	}
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(b[i][j]==2)//判斷輔助數組中數是否為2,如果為2則為鞍點。
            {
            printf("%d %d",i,j);
            count++;//計數判斷無鞍點時
            }
        }
    }
    if(count==0)
    printf("NONE");


	return 0;
	
}
           

讓輔助函數初始化為0為了更好判定鞍點。

思路:先将每行的所有的最大值找到,然後對應其下标,讓對應的輔助數組的值加一(這裡輔助數組的初始化所有值為0),然後再找到所有列的最小值,讓對應的輔助數組的值加一,這是輔助數組裡所儲存的值有三種(0,1,2),0對應既不是行最大值,也不是列最小值;1對應是行最大值或者列最小值;2對應既是行最大值也是列最小值(也就是鞍點),所有這時隻要判斷輔助數組2所儲存的位置既是鞍點所在的位置。

繼續閱讀