记录编号 102056 评测结果 AA
题目名称 [UVa 101] 木块问题 最终得分 100
用户昵称 Gravatarchs 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2014-05-16 18:57:00 内存使用 0.32 MiB
显示代码纯文本
#include<iostream> 
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
class block{
	public:
		int num;
		int x,y;
} n[25],s[25][25];
int p[25];
void clear(int k)
{
	int ps=p[n[k].x]-1,pe=n[k].y;
	for(int i=ps;i>pe;i--){		
		n[s[n[k].num][i].num].x=s[n[k].num][i].num;
		n[s[n[k].num][i].num].y=p[s[n[k].num][i].num];
		s[s[n[k].x][i].num][p[s[n[k].x][i].num]]=s[n[k].x][i];
		p[s[n[k].x][i].num]++;
		p[n[k].x]--;
	}
}
void move_onto(int a,int b)
{
	clear(a);p[n[a].x]--;
	clear(b);	
	n[a].x=n[b].x;
	n[a].y=p[n[b].x];
	s[n[b].x][p[n[b].x]]=n[a];
	p[n[b].x]++;
}
void move_over(int a,int b)
{
	clear(a);p[n[a].x]--;	
	n[a].x=n[b].x;	
	n[a].y=p[n[b].x];
	s[n[b].x][p[n[b].x]]=n[a];
	p[n[b].x]++;
}
void pile_onto(int a,int b)
{
	int p1=p[n[a].x];
	int t1=n[a].x,t2=n[b].x;
	if(t1!=t2){
		clear(b);
		for(int i=n[a].y;i<p1;i++){
			n[s[t1][i].num].x=t2;
			n[s[t1][i].num].y=p[t2];
			s[t2][p[t2]]=n[s[t1][i].num];
			p[t2]++;
			p[t1]--;
		}
	}
}
void pile_over(int a,int b)
{
	int p1=p[n[a].x];
	int t1=n[a].x,t2=n[b].x;
	if(t1!=t2)
	for(int i=n[a].y;i<p1;i++){
		n[s[t1][i].num].x=t2;
		n[s[t1][i].num].y=p[t2];
		s[t2][p[t2]]=n[s[t1][i].num];
		p[t2]++;
		p[t1]--;
	}
}
int N;
int i,j;
int main()
{
	freopen("uvablock.in","r",stdin);
	freopen("uvablock.out","w",stdout);
	cin>>N;
	for(i=0;i<N;i++){
		n[i].num=i;n[i].x=i;n[i].y=0;
		s[i][0]=n[i];
		p[i]=1;}
	string s1,s2;// move / pile // onto / over//
	int a,b; // a / b //
	cin>>s1;
	while(s1!="quit"){
		cin>>a>>s2>>b;
		if(a!=b){
			if(s1=="move" && s2=="onto") move_onto(a,b);
			if(s1=="move" && s2=="over") move_over(a,b);
			if(s1=="pile" && s2=="onto") pile_onto(a,b);
			if(s1=="pile" && s2=="over") pile_over(a,b);
		}
		cin>>s1;
	}
	for(i=0;i<N;i++){
		cout<<i<<": ";
		for(j=0;j<p[i];j++) cout<<s[i][j].num<<" ";
		cout<<endl;
	}
	return 0;
}