sicily 1003. Hit or Miss

来源:互联网 发布:(n-2)的阶层的算法 编辑:程序博客网 时间:2024/05/16 17:32

根据定义的游戏规则进行模拟

当循环200次后牌数仍无变化时,判断为不可获胜状态。这个自己写一个大概的数字就可以了。

用 list :

#include<iostream>#include<list>#include<cstring>using namespace std;int main(){int T,count[11],n;cin>>T;for(int t = 0;t < T;++t){list<int>p[10];cin>>n;memset(count,0,sizeof(count));for(int i = 0;i < 52;++i){int num;cin>>num;p[0].push_back(num);}bool flag;int loop = 0;while(true){for(int i = 0;i < n;++i){if(!p[i].empty()){++count[i];if(count[i] == 14) count[i] = 1;if(count[i] == p[i].front()){p[i].pop_front();if(i != n-1)    p[i+1].push_back(count[i]);loop = 0;}else {int num = p[i].front();p[i].pop_front();p[i].push_back(num);}}}flag = 1;for(int i = 0;i < n;++i){if(!p[i].empty()){flag = 0;break;}}++loop;if(loop > 200 || flag) break;}if(flag){cout<<"Case "<<t+1<<":";for(int i = 0;i < n;++i) cout<<' '<<count[i];cout<<endl;}else cout<<"Case "<<t+1<<": unwinnable"<<endl;}return 0;}


用 queue :

#include<iostream>#include<queue>#include<cstring>using namespace std;int main(){int T,count[11],n;cin>>T;for(int k = 0;k < T;++k){queue<int>p[11];cin>>n;memset(count,0,sizeof(count));for(int i = 0;i < 52;++i){int num;cin>>num;p[0].push(num);}int loop = 0, flag = 0;while(flag != 52){for(int i = 0;i < n;++i){if(!p[i].empty()){++count[i];if(count[i]==14) count[i] = 1;if(count[i]==p[i].front()){p[i].pop();if(i != n-1)   p[i+1].push(count[i]);else flag++;loop = 0;}else {int t = p[i].front();p[i].pop();p[i].push(t);}}}++loop;if(loop > 200) break;}if(flag == 52){cout<<"Case "<<k+1<<":";for(int i = 0;i < n;++i) cout<<' '<<count[i];cout<<endl;}elsecout<<"Case "<<k+1<<": unwinnable"<<endl;}return 0;}