AcWing 3160. 拉马车 简单模拟 C++ AC_any
原题链接
简单
作者:
AC_any
,
2021-04-23 18:55:54
,
所有人可见
,
阅读 635
分析模拟
- 说是一副扑克牌,竟然有一,一是什么牌?
- 未通过的测试用例如下
A78913KA
2456XJQA
已修复
- 唯一的要点是goto直接跳转到发牌方
- 太久出不去,视为死循环
C++
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define NL cout<<endl
using namespace std;
queue<int> A;
queue<int> B;
stack<int> table;
int chToi(char c){
if(c=='A') return 1;
if(c=='X') return 10;
if(c=='K') return 13;
if(c=='Q') return 12;
if(c=='J') return 11;
return (int)(c-'0');
}
char itoc(int i){
if(i==1) return 'A';
if(i==10) return 'X';
if(i==11) return 'J';
if(i==12) return 'Q';
if(i==13) return 'K';
return (char)('0'+i);
}
void init();
string play();
int main(){
init();
string ans=play();
if(ans.empty()) cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
void init(){
string tmpa,tmpb;
getline(cin,tmpa);
getline(cin,tmpb);
int n=tmpa.size();
ffor(i,0,n){
int x=chToi(tmpa[i]);
A.push(x);
}
n=tmpb.size();
ffor(i,0,n){
int x=chToi(tmpb[i]);
B.push(x);
}
/*
ffor(i,0,14){
cout<<sames[i]<<" ";
}
NL;
*/
}
string play(){
bool inStk[14];
memset(inStk,0,sizeof inStk);
int times=1000;
while(true){
xx:
times--;if(times==0) return "";
int a=A.front();A.pop();
if(!inStk[a]){
table.push(a);inStk[a]=1;//入栈就标记
if(A.size()==0) break;//没牌就出局
goto yy;
}
else{
A.push(a);
int top=table.top();table.pop();inStk[top]=0;
while(top!=a){
A.push(top);
top=table.top();table.pop();inStk[top]=0;
}
A.push(a);
goto xx;
}
yy:
int b=B.front();B.pop();
if(!inStk[b]){
table.push(b);inStk[b]=1;
if(B.size()==0) break;
goto xx;
}
else{
B.push(b);
int top=table.top();table.pop();inStk[top]=0;
while(top!=b){
B.push(top);
top=table.top();table.pop();inStk[top]=0;
}
B.push(b);
goto yy;
}
}
string ans;
if(A.size()) {
while(A.size()){
int a=A.front();A.pop();
ans+=itoc(a);
}
}
if(B.size()){
while(B.size()){
int b=B.front();B.pop();
ans+=itoc(b);
}
}
//cout<<times<<endl;
return ans;
}