记录编号 |
102056 |
评测结果 |
AA |
题目名称 |
[UVa 101] 木块问题 |
最终得分 |
100 |
用户昵称 |
chs |
是否通过 |
通过 |
代码语言 |
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;
}