The Blocks Problem stl vector 模拟

The Blocks Problem stl vector 模拟

Analysis of test questions:
Insert picture description here

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int n;

vector<int> ss[26];


void find(int num,int &loc,int &h)   //返回方块num 的堆数和高度 
{
    
    
	
	
	
	for(int i=0;i<n;i++)
	{
    
    
		for(int j=0;j<ss[i].size();j++)
		{
    
    
			if(ss[i][j]==num)
			{
    
    
				loc=i;
				h=j;

				return;
			}
		}
	}
	

}

void clearr(int loc,int h)   //清除堆 loc 高度h以上的方块 
{
    
    
	int i=loc;
	for(int j=ss[i].size()-1;j>h;j--)
	{
    
    
		ss[ss[i][j]].push_back(ss[i][j]);
		ss[i].pop_back();
	}
}

void mv_ot(int a,int b)   
{
    
    
	
	int loc_a=0,loc_b=0;
	int h_a=0,h_b=0;
	find(a,loc_a,h_a);
	
	
	find(b,loc_b,h_b);
	
	if(loc_a==loc_b)
	return ;

	
	clearr(loc_a,h_a);
	clearr(loc_b,h_b);
	
	ss[loc_b].push_back(ss[loc_a][h_a]);
	
	ss[loc_a].pop_back();
	
}

void mv_ov(int a,int b)
{
    
    
	int loc_a,loc_b;
	int h_a,h_b;
	find(a,loc_a,h_a);
	find(b,loc_b,h_b);
		if(loc_a==loc_b)
	return ;
	clearr(loc_a,h_a);
	
	ss[loc_b].push_back(ss[loc_a][h_a]);
	ss[loc_a].pop_back();
	
}


void pi_ot(int a,int b)
{
    
    
	int loc_a,loc_b;
	int h_a,h_b;
	find(a,loc_a,h_a);
	find(b,loc_b,h_b);
		if(loc_a==loc_b)
	return ;
	
	clearr(loc_b,h_b);
		
	
	int cnt=0;
	for(int h=h_a;h<ss[loc_a].size();h++)
	{
    
    
		ss[loc_b].push_back(ss[loc_a][h]);
				cnt++                         ;

	}
	
	
	
//	for(int h=h_a;h<ss[loc_a].size();h++)     !!!!!!  此处错误,上面push后 ss[loc_a].size()会改变 
//	{
    
    
//		ss[loc_a].pop_back();
//	}
//	
//	
	for(int i=1;i<=cnt;i++)          
	{
    
    
		ss[loc_a].pop_back();
	}
	
}

void pi_ov(int a,int b)
{
    
    
	int loc_a,loc_b;
	int h_a,h_b;
	find(a,loc_a,h_a);
	find(b,loc_b,h_b);
		if(loc_a==loc_b)
	return ;
	
	int cnt=0;
	for(int h=h_a;h<ss[loc_a].size();h++)
	{
    
    
		ss[loc_b].push_back(ss[loc_a][h]);
		cnt++;
	}
	for(int i=1;i<=cnt;i++)
	{
    
    
		ss[loc_a].pop_back();
	}
	

}



int main()
{
    
    
	cin>>n;
	
	string code_a;
	string code_b;
	int a,b;
	
	
	for(int i=0;i<n;i++)
	{
    
    
		ss[i].push_back(i);
	}

	
	
	while(cin>>code_a && code_a !="quit")
	{
    
    
		if(code_a=="move")
		{
    
    
			scanf("%d",&a);
			cin>>code_b;
			scanf("%d",&b);
			if(code_b=="onto")
			{
    
    
				mv_ot(a,b);
				
			
			}else {
    
    
				mv_ov(a,b);
				

			}
		}else {
    
    
			
			scanf("%d",&a);
			cin>>code_b;
			scanf("%d",&b);
			if(code_b=="onto")
			{
    
    
				pi_ot(a,b);
				

			}else {
    
    
				pi_ov(a,b);
				
					

			}
		}
		
		
	}
	
	for(int p=0;p<n;p++)
	{
    
    
		printf("%d:",p);
		for(int q=0;q<ss[p].size();q++)
		{
    
    
			printf(" %d",ss[p][q]);
		}
		printf("\n");
	}
		
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_45448563/article/details/113654713