UVa 127 - 'Accordian' Patience(模拟)

给出扑克牌堆,当堆顶的扑克与它左边或者左边第三堆的堆顶的扑克match(suit或rank相同),这张牌就移过去,优先移动三格,优先移动最左边牌堆顶的牌。

一开始用的string,stack,vector模拟的,在UVa上2.899s过了,后来学校有这个题,时间限制1s,进行了优化,VJ上测试0.999过的。

优化后代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
#include<stack>
using namespace std;
stack<char *>pile;
vector<stack<char *> > piles,emp(52);
bool read(){
piles=emp;
char *s=(char *)malloc(3);
scanf("%s",s);
if(s[0]=='#') return false;
piles[0].push(s);
for(int i=1;i<52;++i){
s=(char *)malloc(3);
scanf("%s",s);
piles[i].push(s);
}
return true;
}
bool match(char *a,char *b){
return (a[0]==b[0]||a[1]==b[1]);
}
int move(int i){
if(i>2&&match(piles[i].top(),piles[i-3].top())){
piles[i-3].push(piles[i].top());
piles[i].pop();
if(piles[i].empty()) piles.erase(piles.begin()+i);
return 4;
}
if(i>0&&match(piles[i].top(),piles[i-1].top())){
piles[i-1].push(piles[i].top());
piles[i].pop();
if(piles[i].empty()) piles.erase(piles.begin()+i);
return 2;
}
return 0;
}
void solve(){
int k;
for(int i=1;i<piles.size();i++){
k=move(i);
if(k) i-=k;
}
return;
}
void print(){
printf("%d%s",piles.size(),piles.size()==1?" pile remaining: ":" piles remaining: ");
for(int i=0;i<piles.size();++i){
if(i) printf(" ");
printf("%d",piles[i].size());
}
printf("\n");
return;
}
int main(){
while(read()){
solve();
print();
}
return 0;
}

原代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
stack<string>pile;
vector<stack<string> >piles;
bool read(){
ios::sync_with_stdio(false);
string s;
cin>>s;
if(s=="#") return false;
piles.push_back(pile);
piles[0].push(s);
for(int i=1;i<52;i++){
cin>>s;
piles.push_back(pile);
piles[i].push(s);
}
return true;
}
bool match(string a,string b){
return (a[0]==b[0]||a[1]==b[1]);
}
int move(int i){
if(i>2&&match(piles[i].top(),piles[i-3].top())){
piles[i-3].push(piles[i].top());
piles[i].pop();
if(piles[i].empty()) piles.erase(piles.begin()+i);
return 4;
}
if(i>0&&match(piles[i].top(),piles[i-1].top())){
piles[i-1].push(piles[i].top());
piles[i].pop();
if(piles[i].empty()) piles.erase(piles.begin()+i);
return 2;
}
return 0;
}
void solve(){
int k;
for(int i=0;i<piles.size();i++){
k=move(i);
if(k) i-=k;
}
return;
}
void print(){
ios::sync_with_stdio(false);
cout<<piles.size();
cout<<(piles.size()==1?" pile remaining: ":" piles remaining: ");
for(int i=0;i<piles.size();i++){
if(i) cout<<" ";
cout<<piles[i].size();
}
cout<<endl;
piles.clear();
return;
}
int main(){
while(read()){
solve();
print();
}
return 0;
}

本文迁移自我的 CSDN博客 ,格式可能有所偏差。

支付宝扫码领红包