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

猜你喜欢

转载自blog.csdn.net/wuzhenzi5193/article/details/81604460