POJ:1208 The Blocks Problem
阿新 • • 發佈:2019-02-06
題意:
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; }