soj.1003 hit or miss
来源:互联网 发布:radio html js 编辑:程序博客网 时间:2024/05/29 02:07
问题介绍
一个纸牌游戏,多名玩家数1~13,如果所数的数与最上面的牌的值相同,则传给下一个玩家,否则,将最上面的牌放至队尾。下一个玩家进行同样的操作,最后一名玩家遇到可以传递的牌,则丢弃而不是传给第一个玩家。胜利条件为最后一名玩家丢弃所有的牌。
输入:局数、玩家数、牌的顺序
输出:所有玩家最后丢弃(传递)的牌,或者unwinnable
问题剖析:
1、这道题用到的数据结构,queue(队列),即FIFO(先进先出),来模拟牌的状况。
2、这题的边界判断:什么时候为输----无线循环时,我采用的方法为,用一个steps数组记录下所有玩家,在丢弃下一张牌所需要花多少步,如果所花的步数,超过他自己手中牌乘以13的数值(即最差情况下,每一张手里牌都需要数13次才能数到这个数),这时,肯定是无法丢弃下一张牌,即输了。
下面是我的代码
#include<iostream>#include<queue>using namespace std;int main(void) { int j, t; // j for count, t for times. cin >> t; for (j = 0; j < t; ++j) { // over is used to notice whether the loop is over. // flag is used to notice whether the player is win. int n, i, temp, over = 1, flag = 0, totalcard = 52; // counter for each player's count number // steps is to calculate how many step until we discard the next card int counter[10], steps[10], answer[10]; queue<int> player[10]; // we create the queue array in this loop, so that after each loop it will automatically release the memory // initialize for (i = 0; i < 10; ++i) { counter[i] = 1; steps[i] = 0; } cin >> n; // to store all 52 card number for (i = 0; i < totalcard; ++i) { cin >> temp; player[0].push(temp); } while (over) { for (i = 0; i < n; ++i) {if (player[i].empty()) // if the queue is empty, we need not to do this loop continue;if (counter[i] == player[i].front()) { // is time to deal with the card if (player[i].size() == 1) // if it is the last card of the queue answer[i] = player[i].front(); // we need to store this card for answer if (i != n - 1) // if it is not the last player player[i + 1].push(counter[i]); // we pass the card to next one else --totalcard; // to count whether we discard all the card player[i].pop(); // discard steps[i] = 0; // count from begining} else { // if our count not match the number of the front card player[i].push(player[i].front()); player[i].pop(); // put the front card to the end}// add the counter and make sure it is not out of rangeif (counter[i] >= 13) counter[i] = 1;else ++counter[i];// if the steps that we need to discard one card is more than the steps that I can count all the card in the desk, it means we loseif (steps[i] > (int)player[i].size() * 13) { over = 0; break;}++steps[i]; // add steps } if (totalcard == 0) { // we winflag = 1;over = 0; } } cout << "Case " << j + 1 << ": "; if (flag) { for (i = 0; i < n - 1; ++i)cout << answer[i] << ' '; cout << answer[i] << endl; } else cout << "unwinnable" << endl; }}
0 0
- soj.1003 hit or miss
- 1003: Hit or Miss
- 1003 Hit or Miss
- sicily 1003 Hit or Miss
- 1003. Hit or Miss
- soj1003. Hit or Miss
- 1003. Hit or Miss
- Sicily 1003. Hit or Miss
- sicily--1003. Hit or Miss
- siciy 1003. Hit or Miss
- sicily 1003. Hit or Miss
- Sicily 1003. Hit or Miss
- sicily 1003. Hit or Miss
- Sicily 1003. Hit or Miss
- [sicily] 1003. hit or miss
- sicily 1003. Hit or Miss
- Sicily 1003. Hit or Miss
- hit or miss 解题报告
- android:layout_grovity="bottom" 不起作用
- Tcp协议理解
- c语言中 ++i 和 i++ 问题!
- Java写九九乘法表
- linux gcc /g++ 及一些 参数
- soj.1003 hit or miss
- JavsScript"四舍六入五留双"扩展方法
- IT成长路<2013.9-2014.3>"而立"下篇
- 黑盒技术生成测试用例几种常见方法
- iOS中Bitcode的介绍及配置
- 就写个外键
- Python opencv2 人脸识别
- git上传完整实例
- 做好软件测试需要具备的思维方式