I got Time Limit Exceeded Message....
Code: Select all
/* @BEGIN_OF_SOURCE_CODE */
/* @JUDGE_ID: XXXXX 101 C */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char UINT8;
typedef struct _node{
UINT8 bkNumber;
UINT8 lstNumber;
struct _node* next;
}NODE;
typedef struct _list{
struct _node* head;
}LIST;
typedef struct _listControl{
UINT8 listCount;
struct _list* list;
}LISTCONTROL;
void initialize(LISTCONTROL* listControl, UINT8 count);
void destroy(LISTCONTROL* listControl);
NODE* searchNode(LISTCONTROL* listControl, UINT8 stdNumber, NODE** prev);
void returnInitPos(LISTCONTROL* listControl, NODE* currentNode);
void appendNode(LISTCONTROL* listControl, NODE* node, NODE* destin, UINT8 option);
void moveOnto(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum);
void moveOver(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum);
void pileOnto(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum);
void pileOver(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum);
void printList(LISTCONTROL* listControl);
void parsing(char* inputLine, char* cmd1, char* cmd2, UINT8* origin, UINT8* destin);
int main(){
LISTCONTROL listControl;
UINT8 listCount;
UINT8 command;
char cmd1[5];
char cmd2[5];
char inputLine[20];
UINT8 origin, destin;
scanf("%u", &listCount);
initialize(&listControl, listCount);
getc(stdin);
while(gets(inputLine) != NULL){
command = 0;
parsing(inputLine, cmd1, cmd2, &origin, &destin);
if(strcmp(cmd1, "quit") == 0){
break;
}
else if(strcmp(cmd1, "move") == 0 && strcmp(cmd2, "onto") == 0){
command = 1;
}
else if(strcmp(cmd1, "move") == 0 && strcmp(cmd2, "over") == 0){
command = 2;
}
else if(strcmp(cmd1, "pile") == 0 && strcmp(cmd2, "onto") == 0){
command = 3;
}
else if(strcmp(cmd1, "pile") == 0 && strcmp(cmd2, "over") == 0){
command = 4;
}
switch(command){
case 1:
moveOnto(&listControl, origin, destin);
break;
case 2:
moveOver(&listControl, origin, destin);
break;
case 3:
pileOnto(&listControl, origin, destin);
break;
case 4:
pileOver(&listControl, origin, destin);
break;
}
}
printList(&listControl);
destroy(&listControl);
return 0;
}
void parsing(char* inputLine, char* cmd1, char* cmd2, UINT8* origin, UINT8* destin){
int i;
for(i = 0; i < 4; i++){
cmd1[i] = inputLine[i];
}
cmd1[4] = '\0';
*origin = atoi(&inputLine[5]);
for(i = 0; i < 4; i++){
cmd2[i] = inputLine[i + 7];
}
cmd2[4] = '\0';
*destin = atoi(&inputLine[12]);
return;
}
void initialize(LISTCONTROL* listControl, UINT8 count){
NODE* nNode;
int i;
listControl->listCount = count;
listControl->list = (LIST*)malloc(sizeof(LIST) * count);
for(i = 0; i < count; i++){
nNode = (NODE*)malloc(sizeof(NODE) * 1);
nNode->bkNumber = i;
nNode->lstNumber = i;
nNode->next = NULL;
listControl->list[i].head = nNode;
}
return;
}
void destroy(LISTCONTROL* listControl){
NODE* current;
NODE* temp;
int i;
for(i = 0; i < listControl->listCount; i++){
current = listControl->list[i].head;
if(current == NULL) continue;
while(current != NULL){
temp = current->next;
free(current);
current = temp;
}
}
free(listControl->list);
return;
}
NODE* searchNode(LISTCONTROL* listControl, UINT8 stdNumber, NODE** prev){
NODE* currentNode;
NODE* retVal = NULL;
int i;
for(i = 0; i < listControl->listCount; i++){
currentNode = listControl->list[i].head;
*prev = NULL;
while(currentNode != NULL){
if(currentNode->bkNumber == stdNumber){
retVal = currentNode;
goto EXIT;
}
*prev = currentNode;
currentNode = currentNode->next;
}
}
EXIT:
return retVal;
}
void returnInitPos(LISTCONTROL* listControl, NODE* startNode){
while(startNode != NULL){
listControl->list[startNode->bkNumber].head = startNode;
startNode->lstNumber = startNode->bkNumber;
startNode = startNode->next;
}
return;
}
void appendNode(LISTCONTROL* listControl, NODE* node, NODE* destin, UINT8 option){
while(destin->next != NULL){
destin = destin->next;
}
if(option == 1) node->next = NULL;
node->lstNumber = destin->lstNumber;
destin->next = node;
return;
}
void moveOnto(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum){
NODE* origin;
NODE* destin;
NODE *prevO, *prevD;
origin = searchNode(listControl, originNum, &prevO);
destin = searchNode(listControl, destinNum, &prevD);
if(origin->lstNumber == destin->lstNumber) return;
returnInitPos(listControl, origin->next);
returnInitPos(listControl, destin->next);
origin->next = NULL;
destin->next = NULL;
appendNode(listControl, origin, destin, 1);
if(prevO == NULL){
listControl->list[origin->bkNumber].head = NULL;
}
else{
prevO->next = NULL;
}
return;
}
void moveOver(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum){
NODE* origin;
NODE* destin;
NODE *prevO, *prevD;
origin = searchNode(listControl, originNum, &prevO);
destin = searchNode(listControl, destinNum, &prevD);
if(origin->lstNumber == destin->lstNumber) return;
returnInitPos(listControl, origin->next);
origin->next = NULL;
appendNode(listControl, origin, destin, 1);
if(prevO == NULL){
listControl->list[origin->bkNumber].head = NULL;
}
else{
prevO->next = NULL;
}
return;
}
void pileOnto(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum){
NODE* origin;
NODE* destin;
NODE *prevO, *prevD;
origin = searchNode(listControl, originNum, &prevO);
destin = searchNode(listControl, destinNum, &prevD);
if(origin->lstNumber == destin->lstNumber) return;
returnInitPos(listControl, destin->next);
destin->next = NULL;
appendNode(listControl, origin, destin, 2);
if(prevO == NULL){
listControl->list[origin->bkNumber].head = NULL;
}
else{
prevO->next = NULL;
}
return;
}
void pileOver(LISTCONTROL* listControl, UINT8 originNum, UINT8 destinNum){
NODE* origin;
NODE* destin;
NODE *prevO, *prevD;
origin = searchNode(listControl, originNum, &prevO);
destin = searchNode(listControl, destinNum, &prevD);
if(origin->lstNumber == destin->lstNumber) return;
appendNode(listControl, origin, destin, 2);
if(prevO == NULL){
listControl->list[origin->bkNumber].head = NULL;
}
else{
prevO->next = NULL;
}
return;
}
void printList(LISTCONTROL* listControl){
NODE* current;
int i;
for(i = 0; i < listControl->listCount; i++){
printf("\n%u: ", i);
current = listControl->list[i].head;
while(current != NULL){
printf("%u ", current->bkNumber);
current = current->next;
}
}
printf("\n");
return;
}
/* @END_OF_SOURCE_CODE */