这道题弱化版我是纯模拟做法
每次寻找最大的圆盘
code:(90pts)
#include<bits/stdc++.h>
using namespace std;
//int plt[1305];
int A[1305],B[1005];
int pos[1305];
int ca,cb;
int cnt;
string ans[1300005];
string s[4] = {"A B","B A","A C","B C"};
int main(){
int n;
cin>>n;
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
for(int i=1;i<=n;i++){
cin >> A[n-i+1];
pos[i] = 1;
}
ca=n;
for(int i=n;i>=1;i--){
if( pos[i]==1 ){
while( A[ca]!=i ){
// cout << A[ca] << ": A ---> B" <<endl;
cnt++;
pos[A[ca]]=2;
ans[cnt]=s[0];
B[++cb]=A[ca];
ca--;
}
// cout << A[ca] << ": A ---> C" <<endl;
cnt++;
ans[cnt]=s[2];
ca--;
}
else{
while(B[cb]!=i ){
cnt++;
pos[B[cb]]=1;
ans[cnt]=s[1];
A[++ca]=B[cb];
cb--;
}
cnt++;
ans[cnt]=s[3];
cb--;
}
// cout << B[cb] << ": B ---> A" <<endl;
}
cout << cnt << endl;
for(int i=1; i<=cnt; i++)
cout << ans[i] << endl;
return 0;
}
//每次寻找最大的
//每次记录下两个的位置变化
//如果不是,在A的放到B,在B的放到A
//记录下当前AB两个柱子的状态是什么样的
//记录每个盘的位置变化
//查看当前查找的AB中的最大盘的位置
//模拟
//
//看看AB两个柱子
交了一发发现 RE ( 40pts )
把数组开大之后先统计步数
再次模拟输出步骤
新做法(10pts) (1A 9RE)
#include<bits/stdc++.h>
using namespace std;
//int plt[1305];
int A[300005],B[300005];
int tmp[300005];
int pos[300005];
int ca,cb;
int cnt;
string s[4] = {"A B","B A","A C","B C"};
int main(){
int n;
cin>>n;
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=1;i<=n;i++){
cin >> A[n-i+1];
tmp[n-i+1]=A[n-i+1];
pos[i] = 1;
}
ca=n;
for(int i=n;i>=1;i--){
if( pos[i]==1 ){
while( A[ca]!=i ){
// cout << A[ca] << ": A ---> B" <<endl;
cnt++;
pos[A[ca]]=2;
// cout << s[0] << endl;
B[++cb]=A[ca];
ca--;
}
// cout << A[ca] << ": A ---> C" <<endl;
cnt++;
// cout << s[2] << endl;
ca--;
}
else{
while(B[cb]!=i ){
cnt++;
pos[B[cb]]=1;
// cout << s[i] << endl;
A[++ca]=B[cb];
cb--;
}
cnt++;
// cout << s[3] << endl;
cb--;
}
// cout << B[cb] << ": B ---> A" <<endl;
}
cout << cnt << endl;
cb = 0; ca = n;
for(int i=1;i<=n;i++)
pos[i] = 1;
for(int i=n;i>=1;i--){
if( pos[i]==1 ){
while( A[ca]!=i ){
// cout << A[ca] << ": A ---> B" <<endl;
pos[A[ca]]=2;
cout << s[0] << endl;
B[++cb]=A[ca];
ca--;
}
// cout << A[ca] << ": A ---> C" <<endl;
cout << s[2] << endl;
ca--;
}
else{
while(B[cb]!=i ){
pos[B[cb]]=1;
cout << s[1] << endl;
A[++ca]=B[cb];
cb--;
}
cout << s[3] << endl;
cb--;
}
}
return 0;
}
求de