#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
struct command{
int number;//command number
int op1;
int op2;
};
int blocks[30][30];
void move_onto(struct command cmd,int blocksnumber);
void move_over(struct command cmd,int blocksnumber);
void pile_onto(struct command cmd,int blocksnumber);
void pile_over(struct command cmd,int blocksnumber);
int findindex(int entry,int blocksnumber);
void initialize(int index,int begin);
int main(){
struct command cmd;
int blocksnumber;
cin >> blocksnumber;
memset(blocks,-1,sizeof(blocks));
for(int i=0;i<blocksnumber;i++)
blocks[i][0]=i;
string ins1,ins2;
while(cin >> ins1 && ins1!="quit")
{
cin >> cmd.op1 >> ins2 >> cmd.op2 ;
if(cmd.op1==cmd.op2)
continue;
if(ins1=="move"&&ins2=="onto")
cmd.number=1;
else if(ins1=="move"&&ins2=="over")
cmd.number=2;
else if(ins1=="pile"&&ins2=="onto")
cmd.number=3;
else if(ins1=="pile"&&ins2=="over")
cmd.number=4;
int index1=findindex(cmd.op1,blocksnumber);
int index2=findindex(cmd.op2,blocksnumber);
if(index1==index2)
continue;
if(cmd.number==1)
move_onto(cmd,blocksnumber);
if(cmd.number==2)
move_over(cmd,blocksnumber);
if(cmd.number==3)
pile_onto(cmd,blocksnumber);
if(cmd.number==4)
pile_over(cmd,blocksnumber);
}
for(int i=0;i<blocksnumber;i++)
{
cout << i << ":";
for(int j=0;blocks[i][j]!=-1;j++)
cout << " " << blocks[i][j];
cout << endl;
}
}
void move_onto(struct command cmd,int blocksnumber)
{
int i,j;
int index1=findindex(cmd.op1,blocksnumber);
int index2=findindex(cmd.op2,blocksnumber);
for(i=0;blocks[index1][i]!=-1;i++)
if(cmd.op1==blocks[index1][i])
break;
initialize(index1,i+1);
for(j=0;blocks[index2][j]!=-1;j++)
if(cmd.op2==blocks[index2][j])
break;
initialize(index2,j+1);
blocks[index2][j+1]=cmd.op1;
blocks[index1][i]=-1;
}
void move_over(struct command cmd,int blocksnumber)
{
int i,j;
int index1=findindex(cmd.op1,blocksnumber);
int index2=findindex(cmd.op2,blocksnumber);
for(i=0;blocks[index1][i]!=-1;i++)
if(cmd.op1==blocks[index1][i])
break;
initialize(index1,i+1);
for(j=0;blocks[index2][j]!=-1;j++);
blocks[index2][j]=cmd.op1;
blocks[index1][i]=-1;
//stacknum[cmd.op1]=index2;
}
void pile_onto(struct command cmd,int blocksnumber)
{
int i,j,x,y;
int index1=findindex(cmd.op1,blocksnumber);
int index2=findindex(cmd.op2,blocksnumber);
for(j=0;blocks[index2][j]!=-1;j++)
if(cmd.op2==blocks[index2][j])
break;
initialize(index2,j+1);
for(i=0;blocks[index1][i]!=-1;i++)
if(cmd.op1==blocks[index1][i])
break;
for(x=i,y=j+1;blocks[index1][x]!=-1;x++,y++)
{
blocks[index2][y]=blocks[index1][x];
blocks[index1][x]=-1;
//stacknum[blocks[index1][x]]=index2;
}
}
void pile_over(struct command cmd,int blocksnumber)
{
int i,j,x,y;
int index1=findindex(cmd.op1,blocksnumber);
int index2=findindex(cmd.op2,blocksnumber);
for(i=0;blocks[index1][i]!=-1;i++)
if(cmd.op1==blocks[index1][i])
break;
for(j=0;blocks[index2][j]!=-1;j++);
for(x=j,y=i;blocks[index1][y]!=-1;y++,x++)
{
blocks[index2][x]=blocks[index1][y];
blocks[index1][y]=-1;
//stacknum[blocks[index1][y]]=index2;
}
}
void initialize(int index,int begin)
{
int temp;
for(int i=begin;blocks[index][i]!=-1;i++)
{
temp=blocks[index][i];
blocks[temp][0]=temp;
blocks[index][i]=-1;
//stacknum[temp]=temp;
}
}
int findindex(int entry,int blocksnumber)
{
for(int i=0;i<blocksnumber;i++)
for(int j=0;blocks[i][j]!=-1;j++)
if(entry==blocks[i][j])
return i;
return entry;
}
积木问题
最新推荐文章于 2024-07-23 17:19:30 发布