思路:
运用的核心筛选法:将一个柱中筛选范围内的圆盘依次拿出,将目标和非目标分别移到另两个柱子。
分为大筛选和小筛选两部分:
大筛选: 每次筛出接下来100个要归位的目标,目标放到c柱
小筛选: 从大筛选中筛出的100个中一个一个把下一个归位目标筛出。每次小筛选轮流把非目标移到ab柱(注意:对于每次筛选,非目标会移到同一柱),目标移到c柱
#include<bits/stdc++.h>
using namespace std;
stack < int > a,b,c;
queue < string > ou;
int main(){
int n;
cin>>n;
int x,li[n];
for(int i=1;i<=n;i++){
cin>>li[n-i];
}
for(int i=1;i<=n;i++){
a.push(li[i-1]);
}
int s=100;
while(c.size()<n){
if(s/100%2==1){
while(a.size()>0){
x=a.top();
if(n+1-x>s-100&&n+1-x<=s){
a.pop();
c.push(x);
ou.push("A C");
}else{
a.pop();
b.push(x);
ou.push("A B");
}
}
for(int i=1;i<=min(n-s+100,100);i++){
if(i==1){
for(int j=i;j<=min(n-s+100,100);j++){
x=c.top();
if(n+1-x==s+i-100){
c.pop();
b.push(x);
ou.push("C B");
}else{
c.pop();
a.push(x);
ou.push("C A");
}
}
x=b.top();
b.pop();
c.push(x);
ou.push("B C");
}else if(i%2==1){
for(int j=i;j<=min(n-s+100,100);j++){
x=b.top();
if(n+1-x==s+i-100){
b.pop();
c.push(x);
ou.push("B C");
}else{
b.pop();
a.push(x);
ou.push("B A");
}
}
}else{
for(int j=i;j<=min(n-s+100,100);j++){
x=a.top();
if(n+1-x==s+i-100){
a.pop();
c.push(x);
ou.push("A C");
}else{
a.pop();
b.push(x);
ou.push("A B");
}
}
}
}
}else{
while(b.size()>0){
x=b.top();
if(n+1-x>s-100&&n+1-x<=s){
b.pop();
c.push(x);
ou.push("B C");
}else{
b.pop();
a.push(x);
ou.push("B A");
}
}
for(int i=1;i<=min(n-s+100,100);i++){
if(i==1){
for(int j=i;j<=min(n-s+100,100);j++){
x=c.top();
if(n+1-x==s+i-100){
c.pop();
a.push(x);
ou.push("C A");
}else{
c.pop();
b.push(x);
ou.push("C B");
}
}
x=a.top();
a.pop();
c.push(x);
ou.push("A C");
}else if(i%2==1){
for(int j=i;j<=min(n-s+100,100);j++){
x=a.top();
if(n+1-x==s+i-100){
a.pop();
c.push(x);
ou.push("A C");
}else{
a.pop();
b.push(x);
ou.push("A B");
}
}
}else{
for(int j=i;j<=min(n-s+100,100);j++){
x=b.top();
if(n+1-x==s+i-100){
b.pop();
c.push(x);
ou.push("B C");
}else{
b.pop();
a.push(x);
ou.push("B A");
}
}
}
}
}
s+=100;
}
x=ou.size();
cout<<x<<endl;
for(int i=1;i<=x;i++){
cout<<ou.front()<<endl;
ou.pop();
}
return 0;
}
//(10000+0)*(10000/n+1)/2+((n+1)+1)*n/2=100000000/2/n+10000/2+n*n/2+n=50000000/n+5000+n+n*n/2
//100000000/n+2n+n*n<=1990000
//1000000+200+10000
(算式中n指大筛选中目标数,如上将100代入时,可确保步数小于1000000)