40分的求助
查看原帖
40分的求助
819278
48WangYanJi楼主2023/7/13 17:40

思路:

运用的核心筛选法:将一个柱中筛选范围内的圆盘依次拿出,将目标和非目标分别移到另两个柱子。

分为大筛选和小筛选两部分:

大筛选: 每次筛出接下来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)
2023/7/13 17:40
加载中...