ZOJ-1056

贪吃蛇模拟,链表的运用,用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--;
	else
		i++;
	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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值