积木问题

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值