商人过河的另一个版本(商人数, 船载人数可变)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "sv.h"

void module(struct vector [], int);
bool test(int, int, int);
void delete(void);
void addNew(int, int, int);
void FindOut(void);

int PERSONS, CAPCITY;

s_node *final = NULL;

int main(void)
{
	
	printf("Input the number of traders(just equal #servants): ");
	scanf("%d", &PERSONS);getchar();
	printf("The boat can rive persons: ");
	scanf("%d", &CAPCITY);getchar();
	
	s_node s_first = 
	{
		.x = PERSONS, .y = PERSONS,
		.tst_cnt = 0,
		.dir = 1,					
		.pre = NULL,
	};
	final = &s_first;
	
	int WAYS = CAPCITY + (CAPCITY + 1) * CAPCITY / 2;
	struct vector u[WAYS];
	int k = 0;
	for (int i = 0; i <= CAPCITY; i++)
		for (int j = 0; j <= CAPCITY; j++)
			if (i + j <= CAPCITY && i + j > 0)
			{
				u[k].v =i;
				u[k++].w = j;
			}

	module(u, WAYS);	
	return 0;
}	

void module(struct vector u[], int N)
{
	while (true)
	{
		// stop module
		if (final->x == 0 && final->y == 0)
		{
			FindOut();
			break;
		}
		else if (final->pre == NULL && final->tst_cnt == N)
		{
			printf("No method, well, that is you failed!!!!!!!!!!\n");
			break;
		}
		
		// continue module
		if (final->tst_cnt == N)
		{
			delete();
			continue;	
		}
		
		
		int trader = final->x - (final->dir) * u[final->tst_cnt].v;
		int servant = final->y - (final->dir) * u[final->tst_cnt].w;
		int director = -(final->dir);
		if (test(trader, servant, director))
		{
			addNew(trader, servant, director);
			continue;
		}
	}
}

void FindOut(void)
{
	s_node *iterate = final;
	
	while (iterate != NULL)
	{
		printf("(%d, %d)<-", iterate->x, iterate->y);
		iterate = iterate->pre;
	}
	printf("Start\n");
	printf("Yes, you succeed!!!!\n");
}

bool test(int t, int s, int d)
{
	final->tst_cnt++;

	if (t < 0 || t > PERSONS || s < 0 || s > PERSONS)
		return false;
	
	
	if (t == 0 || t == s || t == PERSONS)
	{
		s_node *iterate = final;
		while (iterate != NULL)
		{
			if (iterate->x == t && iterate->y == s && iterate->dir == d)
				return false;
			iterate = iterate->pre;
		}
		
		return true;
	}
	else
		return false;
}


void delete(void)
{
	s_node *newptr = final;
	
	final = final->pre;
	free(newptr);
}

void addNew(int t, int s, int d)
{
	s_node *newptr = malloc(sizeof(s_node));
	
	newptr->x = t;
	newptr->y = s;
	newptr->dir = d;
	newptr->tst_cnt = 0;
	newptr->pre = final;
	final = newptr;
}

相关结构的申明请看这里


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值