zoukankan      html  css  js  c++  java
  • Uva


    模拟题,调制了一晚上,略伤心,算法速度比较慢。。。用了1秒多,比较直观的做法。

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cctype>
    #include <cstring>
    #include <string>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <bitset> 
    #include <cassert> 
    #include <cmath>
    
    using namespace std;
    
    // 每个牌堆可能有52张牌,用结构体存放牌堆
    struct Pile
    {
    	char cards[53][3];
    	int x; // 牌堆最上面牌的位置
    }pile[53];
    
    // 从i开始往左移动s个距离
    void move(int n, int s)
    {
    	int left = pile[n - s].x;
    	int right = pile[n].x;
    	for (int i = 0; i < 3; i++) {
    		pile[n - s].cards[left + 1][i] = pile[n].cards[right][i];
    	}
    
    	pile[n - s].x++;
    	pile[n].x--;
    
    	if (pile[n].x >= 0) {
    		return;
    	}
    	for (int i = n; i < 52; i++) { // 如果空了,就要把后面的往前移动
    		pile[i] = pile[i + 1];
    	}
    }
    
    int main()
    {
    	while (1) {
    		scanf("%s", pile[0].cards[0]);
    		if ('#' == pile[0].cards[0][0]) {
    			break;
    		}
    		pile[0].x = 0;
    		pile[52].x = -1;
    		// 读入数据
    		for (int i = 1; i < 52; i++) {
    			scanf("%s", pile[i].cards[0]);
    			pile[i].x = 0;
    		}
    
    		bool flag = true;
    		int cnt = 0;
    		while (flag) {
    			int i;
    			for (i = 1; pile[i].x != -1; i++) {
    				int left = pile[i - 3].x; // 牌堆顶部的位置
    				int right = pile[i].x; // 牌堆顶部的位置
    				// 先和左边第3张牌match
    				if (i > 0 &&
    					(pile[i].cards[right][0] == pile[i - 3].cards[left][0] ||
    					pile[i].cards[right][1] == pile[i - 3].cards[left][1])) {
    					move(i, 3);
    					flag = false;
    					break;
    				}
    
    				left = pile[i - 1].x;
    				right = pile[i].x;
    				// 如果左边第3长match失败,再和左边那张match
    				if (pile[i].cards[right][0] == pile[i - 1].cards[left][0] ||
    					pile[i].cards[right][1] == pile[i - 1].cards[left][1]) {
    					move(i, 1);
    					flag = false;
    					break;
    				}
    			}
    			cnt = i;
    			// 判断是否交换,没有交换就跳出while
    			if (true == flag) {
    				flag = false;
    			}
    			else {
    				flag = true;
    			}
    		}
    		if (cnt > 1) {
    			printf("%d piles remaining:", cnt);
    		}
    		else {
    			printf("%d pile remaining:", cnt);
    		}
    		for (int i = 0; pile[i].x != -1; i++) {
    			printf(" %d", pile[i].x + 1);
    		}
    		printf("
    ");
    	}
    
    	return 0;
    }




  • 相关阅读:
    【芯片】国产MCU替代ST芯片调查
    【生产线】包装如何防止配件漏装
    【标准】运输振动试验
    【bat】批量提取文件夹内文件的名称
    【VBA】从批量excel文件中获取数据
    【滤波器】抗混叠滤波器
    【元器件】晶振TCXO、OCXO
    【C】三点求抛物线顶点
    德卡T10读卡器 读取身份证号码和身份证UID
    C# 执行查询语句,返回DataSet
  • 原文地址:https://www.cnblogs.com/zhangyaoqi/p/4591537.html
Copyright © 2011-2022 走看看