题意:
n个盒子,按照规定进行移动,最后输出移动的最终结果
题解:
模拟移动过程,要注意四种移动的不同点
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int all[30][30];
int n;
int find(int x){//找到盒子的现在位置
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(all[i][j]==-1)break;
if(all[i][j]==x){
return i;
}
}
}
return -1;
}
void rese(int x){//将某个盒子放回原位
for(int i=0;i<n;i++){
if(all[x][i]==-1){
all[x][i]=x;
return;
}
}
}
void print(){//打印
for(int i=0;i<n;i++){
printf("%d",i);
printf("%s",":");
if(all[i][0]!=-1)printf("%s"," ");//注意如果该位置没有盒子不输出空格
for(int j=0;j<n;j++){
if(all[i][j]==-1)break;
printf("%d",all[i][j]);
if(j!=n-1)printf("%s"," ");
}
printf("\n");
}
}
int reback(int x,int position){//将盒子上的所有盒子放回原位
for(int i=n-1;i>=0;i--){
if(all[position][i]==x){
return i;
}
if(all[position][i]!=-1){
rese(all[position][i]);
all[position][i]=-1;
}
}
return 0;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
all[i][0]=i;
for(int j=1;j<n;j++){
all[i][j]=-1;
}
}
string first,second;
int a,b;
cin>>first;
while(first!="quit"){
cin>>a>>second>>b;
if(first=="move"){//move
if(second=="onto"){//move onto
int position1=find(a);
int position2=find(b);
if(position1!=position2){
int tmp=reback(a,position1);
all[position1][tmp]=-1;
int tmp2=reback(b,position2);
tmp2++;
all[position2][tmp2]=a;
}
}else{//move over
int position1=find(a);
int position2=find(b);
if(position1!=position2){
for(int i=0;i<n;i++){
if(all[position2][i]==-1){
all[position2][i]=a;
break;
}
}
int tmp=reback(a,position1);
all[position1][tmp]=-1;
}
}
}else if(first=="pile"){//pile
if(second=="onto"){//pile onto
int position1=find(a);
int position2=find(b);
if(position1!=position2){
int time=0;
for(int i=n-1;i>=0;i--){
if(all[position2][i]==b){
time=i;
break;
}
if(all[position2][i]!=-1){
rese(all[position2][i]);
all[position2][i]=-1;
}
}
time++;
bool flag=false;
for(int i=0;i<n;i++){
if(all[position1][i]==-1)break;
if(flag){
all[position2][time]=all[position1][i];
all[position1][i]=-1;
time++;
}
if(all[position1][i]==a){
all[position2][time]=all[position1][i];
time++;
all[position1][i]=-1;
flag=true;
}
}
}
}else{//pile over
int position1=find(a);
int position2=find(b);
if(position1!=position2){
int time=0;
for(int i=0;i<n;i++){
if(all[position2][i]==-1){
time=i;
break;
}
}
bool flag=false;
for(int i=0;i<n;i++){
if(all[position1][i]==-1)break;
if(flag){
all[position2][time]=all[position1][i];
all[position1][i]=-1;
time++;
}
if(all[position1][i]==a){
all[position2][time]=all[position1][i];
time++;
all[position1][i]=-1;
flag=true;
}
}
}
}
}
cin>>first;
}
print();
return 0;
}