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