UVA 246 - 10-20-30 (模拟+STL)
模拟 10 20 30 STL UVa
2023-09-14 09:10:25 时间
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 <cstdio> #include <cstring> #include <set> #include <queue> #include <vector> using namespace std; int num, zero[8]; vector<deque<int> > piple; set<vector<deque<int> > > vis; void init() { vis.clear(); piple.clear(); memset(zero, 0, sizeof(zero)); for (int i = 0; i < 8; i++) piple.push_back(deque<int>()); piple[7].push_back(num); for (int i = 0; i < 51; i++) { scanf("%d", &num); piple[7].push_back(num); } for (int i = 0; i < 7; i++) { int now = piple[7].front(); piple[7].pop_front(); piple[i].push_back(now); } } bool can(int x) { return (x == 10 || x == 20 || x == 30); } bool tra1(int i) { int top1 = piple[i].front(); piple[i].pop_front(); int sum = top1 + piple[i].front() + piple[i].back(); if (can(sum)) { piple[7].push_back(top1); piple[7].push_back(piple[i].front()); piple[7].push_back(piple[i].back()); piple[i].pop_front(); piple[i].pop_back(); return true; } piple[i].push_front(top1); return false; } bool tra2(int i) { int back1 = piple[i].back(); piple[i].pop_back(); int sum = back1 + piple[i].front() + piple[i].back(); if (can(sum)) { piple[7].push_back(piple[i].front()); piple[7].push_back(piple[i].back()); piple[7].push_back(back1); piple[i].pop_front(); piple[i].pop_back(); return true; } piple[i].push_back(back1); return false; } bool tra3(int i) { int back1 = piple[i].back(); piple[i].pop_back(); int back2 = piple[i].back(); piple[i].pop_back(); int sum = back1 + back2 + piple[i].back(); if (can(sum)) { piple[7].push_back(piple[i].back()); piple[7].push_back(back2); piple[7].push_back(back1); piple[i].pop_back(); return true; } piple[i].push_back(back2); piple[i].push_back(back1); return false; } bool tra(int i) { if (piple[i].size() < 3) return false; if (tra1(i)) return true; if (tra2(i)) return true; if (tra3(i)) return true; return false; } void solve() { int i = 0; for (int t = 8; ; t++) { int now = piple[7].front(); piple[7].pop_front(); piple[i].push_back(now); while (tra(i)); if (piple[i].size() == 0) zero[i] = 1; i = (i + 1) % 7; if (vis.find(piple) != vis.end()) { printf("Draw: %d\n", t); return; } vis.insert(piple); if (piple[7].size() == 0) { printf("Loss: %d\n", t); return; } if (piple[7].size() == 52) { printf("Win : %d\n", t); return; } while (zero[i]) i = (i + 1) % 7; } } int main() { while (~scanf("%d", &num) && num) { init(); solve(); } return 0; }
相关文章
- 自动化测试之路 —— Appium输入及模拟手势
- 简单的WinForm模拟鼠标操作
- 【http 请求返回状态码 500 】 Spring Boot 模拟http请求「建议收藏」
- Power BI 模拟麦肯锡糖葫芦
- C语言保姆级喂饭——库函数的模拟实现
- C/C++ 使用Socket模拟远程CMD
- 给大家来一次模拟面试吧~
- 推开图形学大门、进入模拟的世界,超火的太极图形课程开课了
- SQLServer 错误 15517 无法作为数据库主体执行,因为主体“principal”不存在、无法模拟这种类型的主体,或你没有所需的权限。 故障 处理 修复 支持远程
- 谷歌高管解读2021年Q2财报:将使用AR模拟实体店的购物场景
- …Linux模拟:构建可靠的计算环境(linuxsim)
- 使用MySQL实现模拟数据:简单、快速、高效(mysql模拟数据)
- 浅谈JavaScript中面向对象技术的模拟
- 基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例
- Python采用socket模拟TCP通讯的实现方法