#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;
}
相关结构的申明请看这里
商人过河的另一个版本(商人数, 船载人数可变)
最新推荐文章于 2023-09-04 19:50:23 发布