UVA - 246 10-20-30 (模拟+STL)
来源:互联网 发布:拒绝网络暴力议论文 编辑:程序博客网 时间:2024/05/21 22:07
Description
10-20-30
A simple solitaire card game called 10-20-30 uses a standard deck of 52 playing cards in which suit is irrelevant. The value of a face card (king, queen, jack) is 10. The value of an ace is one. The value of each of the other cards is the face value of the card (2, 3, 4, etc.). Cards are dealt from the top of the deck. You begin by dealing out seven cards, left to right forming seven piles. After playing a card on the rightmost pile, the next pile upon which you play a card is the leftmost pile.
For each card placed on a pile, check that pile to see if one of the following three card combinations totals 10, 20, or 30.
1. the first two and last one,2. the first one and the last two, or
3. the last three cards.
If so, pick up the three cards and place them on the bottom of the deck. For this problem, always check the pile in the order just described. Collect the cards in the order they appear on the pile and put them at the bottom of the deck. Picking up three cards may expose three more cards that can be picked up. If so, pick them up. Continue until no more sets of three can be picked up from the pile.
For example, suppose a pile contains 5 9 7 3 where the 5 is at the first card of the pile, and then a 6 is played. The first two cards plus the last card (5 + 9 + 6) sum to 20. The new contents of the pile after picking up those three cards becomes 7 3. Also, the bottommost card in the deck is now the 6, the card above it is the 9, and the one above the 9 is the 5.
If a queen were played instead of the six, 5 + 9 + 10 = 24, and 5 + 3 + 10 = 18, but 7 + 3 + 10 = 20, so the last three cards would be picked up, leaving the pile as 5 9.
If a pile contains only three cards when the three sum to 10, 20, or 30, then the pile "disappears" when the cards are picked up. That is, subsequent play skips over the position that the now-empty pile occupied. You win if all the piles disappear. You lose if you are unable to deal a card. It is also possible to have a draw if neither of the previous two conditions ever occurs.
Write a program that will play games of 10-20-30 given initial card decks as input.
Input
Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. The integers represent card values of the initial deck for that game. The first integer is the top card of the deck. Input is terminated by a single zero (0) following the last deck.
Output
For each input set, print whether the result of the game is a win, loss, or a draw, and print the number of times a card is dealt before the game results can be determined. (A draw occurs as soon as the state of the game is repeated.) Use the format shown in the ``Sample Output" section.
Sample Input
2 6 5 10 10 4 10 10 10 4 5 10 4 5 10 9 7 6 1 7 6 9 5 3 10 10 4 10 9 2 110 1 10 10 10 3 10 9 8 10 8 7 1 2 8 6 7 3 3 8 24 3 2 10 8 10 6 8 9 5 8 10 5 3 5 4 6 9 9 1 7 6 3 5 10 10 8 10 9 10 10 72 6 10 10 4 10 1 3 10 1 1 10 2 2 10 4 10 7 7 1010 5 4 3 5 7 10 8 2 3 9 10 8 4 5 1 7 6 7 2 6 9 10 2 3 10 3 4 4 9 10 1 110 5 10 10 1 8 10 7 8 10 6 10 10 10 9 6 2 10 100
Sample Output
Win : 66Loss: 82Draw: 73题目:一种只纸牌游戏叫做10-20-30,共有52张牌,不考虑花色,K、Q、J的值看做10,其它牌的值看做纸牌的数值,从牌堆顶部开始发牌。先发七张牌,从左到右形成七组。给最右边的那组发完牌后再给最左边的发牌。如果牌堆中出现了一下状况:前两张和最后一张纸牌的总值或者第一张和最后两张纸牌的总值或者最后三张纸牌的总值为10、20或者30,则抽出这三张牌将其放到牌堆底部。如果有一组牌堆只含有三张牌,且他们的总值为10、20、30则抽出这些牌,最后发牌将跳过这一位置,若所有的牌堆都消失了,则赢,当无牌发的时候,输,否则平;输入:输入52张牌的面值输出:胜负结果及所发的牌数;思路:模拟+STL,用map判重#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <deque>#include <map>using namespace std;struct state {int v[70];state() {memset(v, 0, sizeof(v));}bool operator <(const state &x) const {return memcmp(v, x.v, sizeof(state)) < 0;}};deque<int> pile[10];queue<int> hand;map<state, int> record;void reduce(deque<int> &pile) {while (pile.size() >= 3) {int n = pile.size();if ((pile[0]+pile[1]+pile[n-1]) % 10 == 0) {hand.push(pile[0]);hand.push(pile[1]);hand.push(pile[n-1]);pile.pop_front();pile.pop_front();pile.pop_back();} else if ((pile[0]+pile[n-2]+pile[n-1]) % 10 == 0) {hand.push(pile[0]);hand.push(pile[n-2]);hand.push(pile[n-1]);pile.pop_front();pile.pop_back();pile.pop_back();} else if ((pile[n-3]+pile[n-2]+pile[n-1]) % 10 == 0) {hand.push(pile[n-3]);hand.push(pile[n-2]);hand.push(pile[n-1]);pile.pop_back();pile.pop_back();pile.pop_back();}else {return;}}}int main() {int x;while (1) {while (!hand.empty()) hand.pop();for (int i = 0; i < 7; i++)pile[i].clear();for (int i = 0; i < 52; i++) {scanf("%d", &x);if (x == 0) return 0;hand.push(x);}for (int i = 0; i < 7; i++)pile[i].push_back(hand.front()), hand.pop();for (int i = 0; i < 7; i++)pile[i].push_back(hand.front()), hand.pop();int flag = 0, step = 14;while (!flag) {for (int i = 0; i < 7; i++) {if (pile[i].size() == 0)continue;step++;pile[i].push_back(hand.front());hand.pop();reduce(pile[i]);if (hand.size() == 52) {printf("Win : %d\n", step);flag = 1;break;}if (hand.size() == 0) {printf("Loss: %d\n", step++);flag = 1;break;}state s;int m = 0;for (int j = 0; j < 7; j++) {for (int k = 0; k < pile[j].size(); k++)s.v[m++] = pile[j][k];s.v[m++] = 15;}queue<int> q = hand;while (!q.empty()) {s.v[m++] = q.front();q.pop();}s.v[m++] = 15;if (record.find(s) != record.end()) {printf("Draw: %d\n", step);flag = 1;break;}record[s]++;}}}return 0;}
- UVA 246 - 10-20-30 (模拟+STL)
- UVA - 246 10-20-30 (模拟+STL)
- UVa 246 - 10-20-30 [STL应用]
- UVA-508 Morse Mismatches(STL模拟)
- uva 11995 STL模拟
- UVa 246 - 10-20-30(模拟+判重)
- UVA - 101 The Blocks Problem(STL,模拟)
- UVA: I Can Guess the Data Structure!(stl模拟)
- uva 246 - 10-20-30(双端队列+模拟)
- UVA 10954 STL优先队列 模拟Huffmancode
- URL (STL模拟)
- UVA 10815-Andy's First Dictionary(字符串模拟+排序+重复删除||STL-set)
- UVA 11988 STL deque (双端队列||链表模拟)
- UVA - 11995 I Can Guess the Data Structure! 猜猜数据结构(STL模拟)
- UVA Palindromes(模拟)
- uva 133(模拟)
- UVA 12662(模拟)
- UVA 12503(模拟)
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- Android学习之ListView显示XML数据
- 是创业失败还是根本就没有开始?这一年我都干了什么?
- Django 上传文件出现 OSError Permission denied的解决方法
- Ubuntu 12.04 LTS 中文输入法的安装
- UVA - 246 10-20-30 (模拟+STL)
- SQL Server常用内置函数 及 查询示例
- Python学习视频教程大全
- 没有科学家情怀的微软留不住张亚勤
- 深入正则表达式原理
- 字符串匹配KMP算法
- LayoutSubView 和 DrawRect
- 转载!!!枚举的用法
- 张亚勤离职微软的背后隐藏着什么?