ZOJ-1056

来源:互联网 发布:电脑清理软件 知乎 编辑:程序博客网 时间:2024/06/18 07:03

贪吃蛇模拟,链表的运用,用C硬写的。。感觉JAVA的LinkedList应该会简单很多,算复习了一次链表吧,写的时候需要很小心。。中间我忘了赋给一个节点的prev节点,结果就一直指针异常。。查了半天,坑啊。。最后内存还要手动释放

#include<stdio.h>#include<stdlib.h>struct NodeStruct{int i, j;struct NodeStruct *prev, *next;};typedef struct NodeStruct *Node;struct WormStruct{Node head, tail;};typedef struct WormStruct *Worm;static Worm init(){Worm worm = malloc(sizeof(struct WormStruct));Node head = malloc(sizeof(struct NodeStruct));head->i = 25;head->j = 30;head->prev = NULL;Node prev = head;int j;for (j = 29; j >= 11; j--){Node curr = malloc(sizeof(struct NodeStruct));curr->i = 25;curr->j = j;curr->prev = prev;prev->next = curr;prev = curr;}prev->next = NULL;worm->head = head;worm->tail = prev;return worm;}static void move(Worm worm, char c){int i = worm->head->i, j = worm->head->j;if (c == 'E')j++;else if (c == 'W')j--;else if (c == 'N')i--;elsei++;Node head = malloc(sizeof(struct NodeStruct));head->i = i;head->j = j;head->prev = NULL;head->next = worm->head;worm->head->prev = head;worm->head = head;Node tail = worm->tail;worm->tail = tail->prev;worm->tail->next = NULL;free(tail);}static int off_self(Worm worm){Node curr, head = worm->head;int i = head->i;int j = head->j;for (curr = head->next; curr != NULL; curr = curr->next)if (i == curr->i && j == curr->j)return 1;return 0;}static int off_board(Worm worm){int i = worm->head->i;int j = worm->head->j;return i < 1 || j < 1 || i > 50 || j > 50;}int main(){int i, n;char s[100];while (scanf("%d", &n), n){getchar();gets(s);Worm worm = init();for (i = 0; i < n; i++){move(worm, s[i]);if (off_self(worm)){printf("The worm ran into itself on move %d.\n", i + 1);break;}if (off_board(worm)){printf("The worm ran off the board on move %d.\n", i + 1);break;}}if (i == n)printf("The worm successfully made all %d moves.\n", n);Node temp, curr = worm->head;while (curr != NULL){temp = curr;curr = curr->next;free(temp);}free(worm);}return 0;}


0 0
原创粉丝点击