蓄水池问题c语言编程,蓄水池大作战
面向對象,無需算法,有手就行。
以下是Go的實現,無論你學的什么語言都能看懂的。 package main
import (
"fmt"
)
type node struct {
id int
state bool
dad *node
son []*node
}
func (node *node) Drain() {
if node != nil {
node.state = false
node.dad.Drain()
}
}
func (node *node) Fill() {
if node != nil {
node.state = true
for _, son := range node.son {
son.Fill()
}
}
}
func (node *node) State() {
if node.state {
fmt.Println("1")
} else {
fmt.Println("0")
}
}
func connect(p, q int, nodes []*node) {
if p < q {
p, q = q, p
}
nodes[p].dad = nodes[q]
nodes[q].son = append(nodes[q].son, nodes[p])
}
func main() {
var n, p, q int
fmt.Scan(&n)
nodes := []*node{nil}
for i := 1; i <= n; i++ {
nodes = append(nodes, &node{
id: i,
state: false,
dad: nil,
son: nil,
})
}
for i := 1; i < n; i++ {
fmt.Scan(&p, &q)
connect(p, q, nodes)
}
fmt.Scan(&n)
for i := 0; i < n; i++ {
fmt.Scan(&p, &q)
switch p {
case 1:
nodes[q].Fill()
case 2:
nodes[q].Drain()
case 3:
nodes[q].State()
default:
fmt.Println("Invalid operation.")
}
}
}
最后必須得罵一下出題人。 后面n-1行,每行有兩個數字a[i], b[i]。(1<=a[i], b[i]<= n, a[i]!=b[i])表示蓄水池的連接關系。
1 2
5 1
2 3
4 2
我一看2在第二個操作數出現兩次,眾所周知,樹里的一個節點不可能是兩個節點的子節點。所以題目雖然沒說,每行輸入的意思是操作數2是操作數1的父節點,一定是這樣!
然后我重構了這樣的樹。
....3
....|
....2
.../
..1 .4
./
5
然后發現對不上后面的輸出,人都傻了。后來看到 QK康哥在此 的評論才知道,小操作數是大操作數的父節點,一驗證發現的確如此。建議扣出題人一個雞腿。
我開始維護CSDN了,如果以上對你有幫助的話來點個贊吧~
總結
以上是生活随笔為你收集整理的蓄水池问题c语言编程,蓄水池大作战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2017c语言单元测试,vs2017
- 下一篇: 翻转棋游戏c语言讲解,有没有人懂黑白棋(