题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第 i 行上的最大数,第 j 列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
输入格式:
自行输入一个二维数组(关于读取输入部分读者可自行扩展,这里只提供一个思路)
输出格式:
对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。
如果找不到,就输出
找不到鞍点题目所给的数据保证了不会出现多个鞍点。
数组样例1:
1, 7, 4, 1 4, 8, 3, 6 1, 6, 1, 2 0, 7, 8, 9输出样例:
2 1
数组样例2:
1, 7 4, 1输出样例:
找不到鞍点
package main
import "fmt"
func main() {
an()
}
// 鞍点
func an() {
arr1 := [4][4]int{
{1, 7, 4, 1},
{4, 8, 3, 6},
{1, 6, 1, 2},
{0, 7, 8, 9}}
//arr2 := [2][2]int{
// {1, 7},
// {4, 1}}
var lmax int // 行最大
var cmin int // 列最小
var lindex int = 0 // 行最大值的行下标
var cindex int = 0 // 行最大值的列下标
var flag = false
// 找出每行最大
for i := 0; i < len(arr1); i++ {
lmax = arr1[i][0]
for j := 1; j < len(arr1); j++ {
if lmax < arr1[i][j] {
lmax = arr1[i][j]
lindex = i
cindex = j
}
// 存储该行最大以便后续比较是否同为列最小
cmin = arr1[lindex][cindex]
}
// 找出每列最小
for k := 0; k < len(arr1); k++ {
if arr1[k][cindex] < cmin {
cmin = arr1[k][cindex]
}
}
if lmax == cmin {
fmt.Printf("鞍点为%d(%d,%d)", cmin, lindex, cindex)
flag = true
break
}
}
if flag == false {
fmt.Println("找不到鞍点")
}
}