1. 程式人生 > >POJ:1208 The Blocks Problem

POJ:1208 The Blocks Problem

題目連結

題意:

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