101 | The Blocks Problem |
나름대로 시간복잡도 줄여볼려고 노력하다... 머리가 터질 뻔했다. ㅠㅠ
배열안의 배열을 적극 확용한 문제 ㅋㅋㅋㅋㅋ
#include<stdio.h>
#include<string.h>
int blocks[30][30];
int position[30][2];
int stack[30];
void initial(int x){
int i,t,k,m;
t=stack[position[x][0]];
k=position[x][1];
m=position[x][0];
for(i=t;i>=k+1;i--){
blocks[blocks[m][i]][0]=blocks[m][i];
position[blocks[m][i]][0]=blocks[m][i];
position[blocks[m][i]][1]=0;
stack[blocks[m][i]]=0;
blocks[m][i]=0;
stack[m]--;
}
}
void move(int x,int y){
int i,t,k,m;
t=stack[position[x][0]];
k=position[x][0];
m=position[y][0];
for(i=position[x][1];i<=t;i++){
blocks[m][++stack[m]]=blocks[k][i];
position[blocks[k][i]][0]=m;
position[blocks[k][i]][1]=stack[m];
blocks[k][i]=0;
stack[k]--;
}
}
int main(void){
int n,a,b,i,j;
char ins1[10],ins2[10];
scanf("%d",&n);
for(i=0;i<n;i++){
blocks[i][0]=i;
position[i][0]=i;
position[i][1]=0;
stack[i]=0;
}
while(n){
scanf("%s",ins1);
if(strcmp(ins1,"quit")==0)
break;
scanf("%d %s %d",&a,ins2,&b);
if((a==b) || (position[a][0]==position[b][0]))
continue;
if(strcmp(ins1,"move")==0){
if(strcmp(ins2,"onto")==0){
initial(a);
initial(b);
move(a,b);
}
else if(strcmp(ins2,"over")==0){
initial(a);
move(a,b);
}
}
else if(strcmp(ins1,"pile")==0){
if(strcmp(ins2,"onto")==0){
initial(b);
move(a,b);
}
else if(strcmp(ins2,"over")==0){
move(a,b);
}
}
}
for(i=0;i<n;i++){
printf("%d:",i);
for(j=0;j<=stack[i];j++){
printf(" %d",blocks[i][j]);
}
printf("\n");
}
return 0;
}