• UVa 246


    这道题在数据结构这一章里算是简单的,但是很容易WA和RE,可能得debug很长时间。

    值得注意的地方:

    1.纸牌被处理的次数中,每次发牌并且检查一次匹配,算处理一次,而不是四次

    2.查看匹配的时候,如果一次匹配成功并且删除了三张纸牌,要继续检查是否匹配,这是个循环的过程

    3.可以通过用set记录State判重,判断打平的情况

    4.纸牌收回手中时,注意纸牌摆放的顺序

    #include <bits/stdc++.h>
    using namespace std;
    
    int cnt = 0;
    deque<int> hand;
    vector<deque<int>> tab;
    set<vector<deque<int>>> s;
    
    bool input(){
    	cnt = 0; hand.clear();
    	while (true){
    		int x; cin >> x;
    		if (!x) return false;
    		hand.push_back(x);
    		if (hand.size() == 52) return true;
    	}
    }
    bool can(int a, int b, int c, deque<int> & cur){
    	int val1 = a >= 0 ? *(cur.begin() + a) : *(cur.end() + a);
    	int val2 = b >= 0 ? *(cur.begin() + b) : *(cur.end() + b);
    	int val3 = c >= 0 ? *(cur.begin() + c) : *(cur.end() + c);
    	int sum = val1 + val2 + val3;
    	return sum == 10 || sum == 20 || sum == 30;
    }
    bool match(deque<int> & cur){
    	if (can(0, 1, -1, cur)){
    		int t0 = cur.front(); cur.pop_front();
    		int t1 = cur.front(); cur.pop_front();
    		int t_1 = cur.back(); cur.pop_back();
    		hand.push_back(t0); hand.push_back(t1); hand.push_back(t_1);
    		return true;
    	}
    	if (can(0, -1, -2, cur)){
    		int t0 = cur.front(); cur.pop_front();
    		int t_1 = cur.back(); cur.pop_back();
    		int t_2 = cur.back(); cur.pop_back();
    		hand.push_back(t0); hand.push_back(t_2); hand.push_back(t_1);
    		return true;
    	}
    	if (can(-1, -2, -3, cur)){
    		int t_1 = cur.back(); cur.pop_back();
    		int t_2 = cur.back(); cur.pop_back();
    		int t_3 = cur.back(); cur.pop_back();
    		hand.push_back(t_3); hand.push_back(t_2); hand.push_back(t_1);
    		return true;
    	}
    }
    void run(){
    	tab.clear(); tab.resize(7);
    	s.clear();
    	int cur = 0;
    	while (++cnt, true) {
    		int x = hand.front(); hand.pop_front();
    		tab[cur].push_back(x);
    		while (tab[cur].size() >= 3 && match(tab[cur]));
    		if (hand.size() == 52) { printf("Win : %d
    ", cnt); return; }
    		if (hand.size() == 0) { printf("Loss: %d
    ", cnt); return; }
    		vector<deque<int>> t(tab); t.push_back(hand);
    		if (s.count(t)) { printf("Draw: %d
    ", cnt); return; }
    		else s.insert(t);
    		do {
    			cur = (cur + 1) % 7;
    		} while (tab[cur].size() == 0 && cnt >= 8);
    	}
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	while (input())
    		run();
    	return 0;
    }


  • 相关阅读:
    Maximum sum
    走出迷宫
    取石子游戏
    全排列
    BZOJ3456 城市规划
    【SHOI2016】黑暗前的幻想乡
    【AHOI2012】信号塔
    HDU5730 Shell Necklace
    线性常系数齐次递推关系学习笔记
    矩阵树定理学习笔记
  • 原文地址:https://www.cnblogs.com/kunsoft/p/5312700.html
Copyright © 2020-2023  润新知