习题6-10 10-20-30游戏(10-20-30, ACM/ICPC World Finals 1996, UVa246)
来源:互联网 发布:大学生生活费的数据 编辑:程序博客网 时间:2024/04/30 06:39
这是一道STL模拟题。水。
利用vector与deque的已有的等号运算符,可以实现题中draw的判断。其余的win与lose很好判断。
注意每次操作直到此堆不能再取回排为止。
利用vector与deque的已有的等号运算符,可以实现题中draw的判断。其余的win与lose很好判断。
注意每次操作直到此堆不能再取回排为止。
#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define LL long long#define maxn 200005#define maxm 100005#define mod 1000000007#define INF 1000000007#define eps 1e-5#define PI 3.1415926535898#define N 26using namespace std;//-------------------------CHC------------------------------//vector<deque<int>> deq;set<vector<deque<int>>> s;int cur, cnt;void init() {deq.clear();s.clear();cur = -1;cnt = 7;for (int i = 0; i < 8; ++i)deq.push_back(deque<int>());}bool can(int a, int b, int c) {return (a + b + c) == 10 || (a + b + c) == 20|| (a + b + c) == 30;}void reuse(int a, int b, int c) {deque<int> &D = deq[7];D.push_back(a);D.push_back(b);D.push_back(c);}bool op1(deque<int> &d) {int b1, b2, b3;b1 = d.back(), d.pop_back();b2 = d.back(), d.pop_back();b3 = d.back(), d.pop_back();if (can(b1, b2, b3)) {reuse(b3, b2, b1);return true;}else {d.push_back(b3);d.push_back(b2);d.push_back(b1);return false;}}bool op2(deque<int> &d) {int f1, f2, f3, f4;f1 = d.front(), d.pop_front();f2 = d.front(), d.pop_front();f3 = d.front(), d.pop_front();f4 = d.front(), d.pop_front();if (can(f1, f2, f4)) {d.push_front(f3);reuse(f1, f2, f4);return true;}else if (can(f1, f3, f4)) {d.push_front(f2);reuse(f1, f3, f4);return true;}else if (can(f2, f3, f4)) {d.push_back(f1);reuse(f2, f3, f4);return true;}else {d.push_back(f1);d.push_back(f2);d.push_back(f3);d.push_back(f4);return false;}}bool op3(deque<int> &d) {int f1, f2, b1, b2, b3;f1 = d.front(), d.pop_front();f2 = d.front(), d.pop_front();b1 = d.back(), d.pop_back();b2 = d.back(), d.pop_back();b3 = d.back(), d.pop_back();if (can(f1, f2, b1)) {d.push_back(b3);d.push_back(b2);reuse(f1, f2, b1);return true;}else if (can(f1, b1, b2)) {d.push_front(f2);d.push_back(b3);reuse(f1, b2, b1);return true;}else if (can(b1, b2, b3)) {d.push_front(f2);d.push_front(f1);reuse(b3, b2, b1);return true;}else {d.push_front(f2);d.push_front(f1);d.push_back(b3);d.push_back(b2);d.push_back(b1);return false;}}bool solve(deque<int> &d) {bool ret = false;if (d.size() < 3) return false;if (d.size() == 3) ret = op1(d);else if (d.size() == 4) ret = op2(d);else if (d.size() >= 5) ret = op3(d);return ret;}int check() {bool ok = true;//cout << deq[7].size() << endl;for (int i = 0; i < 7; ++i) {//printf("deq %d: %d\n", i + 1, deq[i].size());if (deq[i].size()) ok = false;}if (ok) return 1;if (s.count(deq)) return -1;else s.insert(deq);return 0;}void move() {++cur, cur %= 7;while (deq[cur].size() == 0) ++cur, cur %= 7;}int main() {int x;while (scanf("%d", &x) && x) {init();deq[7].push_back(x);for (int i = 1; i < 52; ++i) scanf("%d", &x), deq[7].push_back(x);for (int i = 0; i < 7; ++i) {x = deq[7].front();deq[7].pop_front();deq[i].push_back(x);}int win = 0;s.insert(deq);while (win == 0) {if (deq[7].empty()) { win = -1; break; }move();int card = deq[7].front(); deq[7].pop_front();deque<int> &d = deq[cur];d.push_back(card);while (solve(d));//注意cnt++;int res = check();if (res == 1) win = 1;else if (res == -1) break;}if (win == 1) printf("Win : %d\n", cnt);else if (win == -1) printf("Loss: %d\n", cnt);else printf("Draw: %d\n", cnt);}return 0;}
阅读全文
0 0
- 习题6-10 10-20-30游戏(10-20-30, ACM/ICPC World Finals 1996, UVa246)
- UVa246-10-20-30
- UVA246 - 10-20-30(队列+ 模拟)
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- UVa804 习题 6-7 Petri网模拟(Petri Net Simulation,ACM/ICPC World Finals 1998)
- UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)
- 习题6-7 Petri网模拟(Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)
- 习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
- 习题6-12 筛子难题(A Dicey Problem, ACM/ICPC World Finals 1999, UVa810)
- 习题6-13 电子表格计算器(Spreadsheet Calculator, ACM/ICPC World Finals 1992, UVa215)
- 算法竞赛入门经典-习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994,UVa232)
- 习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)
- 习题7-1 消防车(Firetruck, ACM/ICPC World Finals 1991, UVa208)
- 习题7-2 黄金图形(Golygons, ACM/ICPC World Finals 1993, UVa225)
- 习题7-3 多米诺效应(The Domino Effect, ACM/ICPC World Finals 1991, UVa211)
- 习题7-4 切断圆环链(Cutting Chains, ACM/ICPC World Finals 2000, UVa818)
- ACM-ICPC World Finals 2017
- 例题6-1 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991, UVa210)
- 【LeetCode】C# 5. Longest Palindromic Substring
- 蓝桥杯 算法提高 插入排序
- 创建套接字
- 英格尔斯论现代人
- Django入门学习笔记
- 习题6-10 10-20-30游戏(10-20-30, ACM/ICPC World Finals 1996, UVa246)
- idea 建立多个有依赖关系的maven项目步骤及注意点
- js单线程与异步
- 15年大神分享心得
- Qt笔记_8
- 遗传算法简单介绍与MATLAB实现(一)
- C++的基础知识(七)--符号->
- 美化input : file样式
- numpy 常用操作