UVA 246 10-20-30

题意:

  给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断):1、头两张+尾一张和为10或20或30。2、头一张+尾两张和为10或20或30。3、尾三张和为10或20或30。就把这三张牌拿走,放到总牌堆底(这步要不断执行直到不再满足条件或牌堆没了)如果有一个牌堆因为这个操作被取完了,那么以后将不在这个位置发牌。如果最后7个牌堆都可以消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)。问最后的输赢平,并输出步数

分析:

  模拟,用一个vector记录下7个牌堆和总牌堆,这样就可以用set去记录状态了,然后每个牌堆用一个双端队列deque表示,这样满足可以从头也可以从尾巴取,不断模拟即可

代码:

  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int N=7;
int ans;
struct node
{
    int v[N*10];
    bool operator<(const node &a) const
    {
        return memcmp(v,a.v,sizeof(node))<0;
    }
};
queue<int> hand;
deque<int> piles[N];
map<node,int> st;
void handle (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-1]+pile[n-2])%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-1]+pile[n-2]+pile[n-3])%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 solve()
{
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<N;j++)
        {
            piles[j].push_back(hand.front());
            hand.pop();
        }
    }
    ans=14;
    node tmp;
    while(hand.size())
    {
        for(int i=0;i<N;i++)
        {
            if(hand.size()==52)
                return 1;
            if(piles[i].size()==0)
                continue;
            if(hand.size())
            {
                piles[i].push_back(hand.front());
                hand.pop();
                ans++;
                handle(piles[i]);
                int cnt=0;
                memset(tmp.v,0,sizeof(tmp.v));
                for(int k=0;k<N;k++)
                {
					for (int j=0;j<piles[k].size();j++)
						tmp.v[cnt++]=piles[k][j];
					tmp.v[cnt++]=11;
				}
				queue<int>q=hand;
				while (!q.empty())
                {
					tmp.v[cnt++]=q.front();
					q.pop();
				}
				tmp.v[cnt]=11;
				if(st[tmp])
                    return -1;
                else
                    st[tmp]=1;
            }
            else
                return  0;
        }
    }
    return 0;
}
int main()
{
    int card;
    while(scanf("%d",&card)&&card)
    {
        while (!hand.empty())
        {
            hand.pop();
        }
        st.clear();
        for (int i = 0; i < N; i++)
            piles[i].clear();
        hand.push(card);
        for(int i=0;i<51;i++)
        {
            scanf("%d",&card);
            hand.push(card);
        }
        int tmp=solve();
        if (tmp == 0)
			printf ("Loss: %d\n", ans);
		else if (tmp == 1)
			printf ("Win : %d\n", ans);
		else
			printf ("Draw: %d\n", ans);

    }
}
时间: 2024-08-23 12:08:54

UVA 246 10-20-30的相关文章

个人回忆录 2014.10.20 至 2015.7.30

时间过的太快.以至于对我来说都记不起来每天做了些什么事情.工作节奏太快,下班.上班 然后再下班再上班. 每天下班后都晚上9点左右.真的看不见日出看不见日落. 从2014.10.20 到现在已经快10个月了.新的工作环境以及新的同事.上司都已熟悉了.回想刚刚开始进入这个研发团队的时候. 高原反应非常强烈,总是在疑问自己为何选择这个方向—C++ 客户端开发.为何不沿用最熟悉的.NET 平台开发.当从新学习一门新技术的时候 才发现自己太笨.有点像当年的高考,时间很紧.因为没有太多的时间用在学习上.MF

UVA 246 - 10-20-30 (模拟+STL)

UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断): 1.头两张+尾一张和为10或20或30 2.头一张+尾两张和为10或20或30 3.尾三张和为10或20或30 就把这三张牌拿走,放到总牌堆底(这步要不断执行直到不再满足条件或牌堆没了) 如果有一个牌堆因为这个操作被取完了,那么以后将不在这个位置发牌. 如果最后7个牌堆都可以消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)

[uva 246][deque]10-20-30

 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

UVA - 246 10-20-30 (模拟+STL)

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 c

10.19-10.22 iptables规则备份和恢10.20 firewalld的9个zone

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 # 10.19 iptables 规则备份和恢复 - 保存和备份iptables 的规则 - service iptables save 会把规则保存到 /etc/sysconfig/iptables - 把iptables规则备份到my.ipt 文件中 - iptables-save > my.ipt

(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出

(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安川 前言 本篇文章并没有太多WebWork 的实战代码细节.本人非常希望能充当一名导游的角色,带领读者逐步游览WebWork的功能特性和原理.在第一章,我们将提出基于三层架构的Web层需要解决的10个问题,这是本文的纵轴.围绕着纵轴,我们按照横轴的顺序逐步描述讲解:WebWork简介.WebWork入门.We

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

给你六种面额1 5 10 20 50 100元的纸币假设每种币值的数量足够多

编写程序求组成N元的不同组合的个数.输入一个数字N输出一个也是数字,为组成N的组合个数.如输入2,输出1,输入5,输出2 背包问题: 1 function fn (all) { 2 const arr = [1, 5, 10, 20, 50, 100], 3 len = arr.length, 4 res = []; 5 for (let i = 0; i <= len; i++) { 6 res[i] = []; 7 res[i][0] = 1; 8 } 9 for (let j = 1; j

[OpenStack 存储] 说说RAID0 1 2 3 4 5 6 10 01 30 50, 软RAID, 硬RAID

最近在思考一种廉价方便的cinder集成LVM driver的方式,那就是cinder+LVM+多块盘组成的RAID硬盘.这样的情况下就要根据读写需求和可用资源考虑采用什么样的RAID,以及怎样选择实现raid的方式,有两种分别为硬件RAID和软件RAID,为了温习一下,就顺便画些图(图中使用的硬盘数都是该RAID下需要的最少硬盘数)总结下各个RAID技术. 软RAID与硬RAID 硬RAID可以理解为需要RAID卡,通过RAID卡实现对多块盘的管理, 把多块盘组成RAID冗余阵列,如何组合成R

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21

七周五次课 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 启动firewalld防火墙,关闭iptables 查看所有的zone和默认的zone 10.21 firewalld关于zone的操作 设置默认zone 设置网卡的zone 10.22 firewal