Code: Select all
#include <stdio.h>
#include <string.h>
#define MOVE_ONTO 1
#define MOVE_OVER 2
#define PILE_ONTO 3
#define PILE_OVER 4
int file_input = 0;
typedef struct{
int x, y, top;
} Position;
Position search(int **block, int size, int target);
Position move_back(int **block, int size, Position dest);
void process(int **block, int size, int src, int dest, int case_type);
int main(){
char cmdstr[20], cmd1[20],cmd2[20], tmp_f[20];
char *tmp;
int i, j, first, second, block_num, quit;
FILE *pf;
memset(cmdstr, 0, sizeof(cmdstr));
if(file_input == 1){
pf = fopen("input.txt","r");
fgets(cmdstr, sizeof(cmdstr), pf);
}
else
fgets(cmdstr, sizeof(cmdstr), stdin);
block_num=atoi(cmdstr);
if(block_num >= 25 || block_num <= 0)
return 0;
int **stack;
stack = malloc(block_num * sizeof(int*));
for(i=0 ; i<block_num ; i++)
stack[i] = malloc(block_num * sizeof(int*));
for(i=0 ; i<block_num ; i++){
stack[i][0] = i;
for(j=1 ; j<block_num ; j++)
stack[i][j] = -1;
}
do{
memset(cmdstr, 0, sizeof(cmdstr));
memset(cmd1, 0, sizeof(cmd1));
memset(cmd2, 0, sizeof(cmd2));
memset(tmp_f, 0, sizeof(tmp_f));
if(file_input==1)
fgets(cmdstr, sizeof(cmdstr), pf);
else
fgets(cmdstr, sizeof(cmdstr), stdin);
tmp = strtok(cmdstr," \n");
if(tmp != NULL){
strcpy(cmd1, tmp);
if( strcmp(cmd1,"quit") != 0){
tmp = strtok(NULL," ");
if(tmp != NULL){
strcpy(tmp_f, tmp);
first = atoi(tmp_f);
}
tmp = strtok(NULL," ");
if(tmp != NULL)
strcpy(cmd2, tmp);
tmp = strtok(NULL," ");
if(tmp != NULL){
strcpy(tmp_f, tmp);
second = atoi(tmp_f);
}
if(first == second)
continue;
if(strcmp(cmd1, "move") == 0){
if(strcmp(cmd2, "onto") == 0)
process(stack, block_num, first, second, MOVE_ONTO);
if(strcmp(cmd2, "over") == 0)
process(stack, block_num, first, second, MOVE_OVER);
}
if(strcmp(cmd1, "pile") == 0){
if(strcmp(cmd2, "onto") == 0)
process(stack, block_num, first, second, PILE_ONTO);
if(strcmp(cmd2, "over") == 0)
process(stack, block_num, first, second, PILE_OVER);
}
}
else{
for(i=0 ; i<block_num ; i++){
printf("%d:",i);
for(j=0 ; j<block_num ; j++){
if(stack[i][j]!=-1)
printf(" %d", stack[i][j]);
}
printf("\n");
}
quit = 1;
}
}
}while(quit!=1);
for(i=0 ; i<block_num ; i++)
free(stack[i]);
free(stack);
if(file_input==1)
fclose(pf);
return 0;
}
Position search(int **block, int size, int target){
Position report;
int i,j,done=0;
for(i=0 ; i<size ; i++){
for(j=0 ; j<size ; j++){
if(block[i][j] == target){
report.x = i;
report.y = j;
done = 1;
}
if(block[i][j] == -1){
report.top = j;
j = size;
}
}
if(done == 1){
break;
}
}
return report;
}
Position move_back(int **block, int size, Position dest){
int i, j, buf;
i = dest.x;
j = dest.y+1;
buf = block[i][j];
while(buf != -1){
block[buf][0] = buf;
block[i][j] = -1;
j++;
buf = block[i][j];
}
dest.top = dest.y+1;
return dest;
}
void process(int **block, int size, int src, int dest, int case_type){
Position p_src, p_dest;
p_src = search(block, size, src);
p_dest = search(block, size, dest);
if(p_src.x != p_dest.x){
switch(case_type){
case MOVE_ONTO:{
p_src = move_back(block, size, p_src);
p_dest = move_back(block, size, p_dest);
block[p_dest.x][p_dest.top] = block[p_src.x][p_src.y];
block[p_src.x][p_src.y] = -1;
break;
}
case MOVE_OVER:{
p_src = move_back(block, size, p_src);
block[p_dest.x][p_dest.top] = block[p_src.x][p_src.y];
block[p_src.x][p_src.y] = -1;
break;
}
case PILE_ONTO:{
p_dest = move_back(block, size, p_dest);
int i = p_src.y, j = p_dest.top, quit = 0;
do{
if(block[p_src.x][i]==-1)
quit = 1;
block[p_dest.x][j] = block[p_src.x][i];
block[p_src.x][i] = -1;
i++; j++;
}while(quit != 1);
break;
}
case PILE_OVER:{
int i = p_src.y, j = p_dest.top, quit = 0;
do{
if(block[p_src.x][i]==-1)
quit = 1;
block[p_dest.x][j] = block[p_src.x][i];
block[p_src.x][i] = -1;
i++; j++;
}while(quit != 1);
break;
}
}
}
}