题目来源
题目描述
小美有N张牌,牌上分别写有数字1到N,她打算用这些牌和小团玩洗牌游戏。小美将牌叠成一堆放在桌上,每次可以从桌上的牌堆的顶部取走一张牌,叠放在自己手上,或者将自己手上的牌堆的顶部或底部的一张牌交给小团,直到N张牌都交给小团。通俗地说,一开始桌上的牌堆有N张牌,小美手上的牌堆有0张牌,她每次可以将桌上牌堆顶的一张牌放到自己手上的牌堆顶,或者将手上牌堆顶或牌堆底的一张牌交给小团。小团收到的牌上面的数字(按收到的顺序)依次为A[1]到A[N]。现在,小美问小团是否有可能,初始时桌上的牌堆从顶部到底部,牌上所写的数字依次为1到N。
代码
package main
import (
"fmt"
)
func main() {
var s int
fmt.Scan(&s)
for s > 0 {
var n, l int
fmt.Scan(&n)
ans := []int{}
for i := 0; i < n; i++ {
fmt.Scan(&l)
ans = append(ans, l)
}
//如果小美的队列是空的,那么这张牌直接添加.
cardsM := []int{}
for i := 1; i <= n; i++ {
//小美的队列是空的,那么直接添加
cardsM = append(cardsM, i)
//然后看一下牌跟要求的顺序一样不一样,如果一样可以抽牌.
for len(ans) > 0 && len(cardsM) > 0 {
if ans[0] == cardsM[0] {
//如果头部相等,那么删除,然后下一个.
ans = ans[1:]
cardsM = cardsM[1:]
} else if ans[0] == cardsM[len(cardsM)-1] {
cardsM = cardsM[:len(cardsM)-1]
ans = ans[1:]
} else {
break
}
}
}
if len(ans) == 0 || len(cardsM) == 0 {
fmt.Println("Yes")
} else {
fmt.Println("No")
}
s--
}
}