[编程题]洗牌游戏

49 阅读1分钟

题目来源

www.nowcoder.com/questionTer…

题目描述

小美有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--
	}
}