1.2 青蛙的邻居

例 1.2 青蛙的邻居(Frogs' Neighborhood)

题目来源:

POJ Monthly - 2004.05.15, POJ1659

题目描述:

未名湖附近共有 n 个大小湖泊 L1, L2, ..., Ln(其中包括未名湖),每个湖泊 Li里住着一只青蛙
Fi(1≤i≤n)。如果湖泊 Li和 Lj之间有水路相连,则青蛙 Fi和 Fj互称为邻居。现在已知每只青蛙的
邻居数目 x1, x2, ..., xn,请你给出每两个湖泊之间的相连关系。

输入描述:

第一行是测试数据的组数 t(0 ≤ t ≤ 20)。每组数据包括两行,第一行是整数 n(2 ≤ n ≤ 10),
第二行是 n 个整数,x1, x2,..., xn(0 ≤ xi < n)。

输出描述:

对输入的每组测试数据,如果不存在可能的相连关系,输出"NO"。否则输出"YES",并用 n×n
的矩阵表示湖泊间的相邻关系,即如果湖泊 i 与湖泊 j 之间有水路相连,则第 i 行的第 j 个数字为
1,否则为 0。每两个数字之间输出一个空格。如果存在多种可能,只需给出一种符合条件的情形。
相邻两组测试数据之间输出一个空行。

样例输入:

2
7
4 3 1 5 4 2 1
6
4 3 1 4 2 0

样例输出:

YES
0 1 0 1 1 1 0
1 0 0 1 1 0 0
0 0 0 1 0 0 0
1 1 1 0 1 1 0
1 1 0 1 0 0 1
1 0 0 1 0 0 0
0 0 0 0 1 0 0
NO

代码

package main

import (
	"fmt"
	"sort"
)

const (
	MaxLakeCnt = 10
)

var (
	groupCnt = 0
)

type Lake struct {
	Idx    int
	Degree int
}

type Lakes []*Lake

func (a Lakes) Len() int           { return len(a) }
func (a Lakes) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a Lakes) Less(i, j int) bool { return a[i].Degree > a[j].Degree }

func main() {
	fmt.Println("请输入组数:")
	fmt.Scanln(&groupCnt)

GROUP:
	for g := 0; g < groupCnt; g++ {
		lakeCnt := 0
		fmt.Printf("[组%d]请输入湖的数量:\n", g)
		fmt.Scanln(&lakeCnt)

		lakes := make(Lakes, lakeCnt)
		arr := [MaxLakeCnt][MaxLakeCnt]int{}
		fmt.Printf("[组%d]请输入邻居数目:\n", g)
		for i := 0; i < int(lakeCnt); i++ {
			lakes[i] = &Lake{
				Idx: i,
			}
			fmt.Scanf("%d", &lakes[i].Degree)
		}

		for i := 0; i < lakeCnt; i++ {
			sort.Sort(lakes[i:])
			lake := lakes[i]

			if lake.Degree > lakeCnt-i-1 {
				fmt.Println("NO")
				continue GROUP
			}

			for offset := 1; offset <= lake.Degree; offset++ {
				nextLake := lakes[i+offset]
				nextLake.Degree--
				if nextLake.Degree < 0 {
					fmt.Println("NO")
					continue GROUP
				}
				arr[lake.Idx][nextLake.Idx] = 1
				arr[nextLake.Idx][lake.Idx] = 1
			}
		}

		fmt.Println("YES")
		for i := 0; i < len(lakes); i++ {
			for j := 0; j < len(lakes); j++ {
				fmt.Print(arr[i][j])
				if j != len(lakes)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Print("\n")
		}
	}
}
posted @ 2024-02-06 19:00  feiquan  阅读(25)  评论(0)    收藏  举报
如果是此文是转载文章,本人会附上转载链接,此篇文章的版权归原创作者所属,如果侵权请与我联系,我会删除此文。

若没有标明转载链接,此篇文章属于本人的原创文章,其版权所属:
作者:feiquan
出处:http://www.cnblogs.com/feiquan/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
大家写文都不容易,请尊重劳动成果~ 这里谢谢大家啦(*/ω\*)