数据结构算法题2
(分酒问题)已知有三个容量分别为3千克、5千克和8千克的并且是没有刻度的酒瓶,3千克和5千克的瓶子均装满了酒,而8千克的瓶子为空。现要求仅用这三个酒瓶将这些酒均分为两个4千克并分别装入5千克和8千克的瓶子中。
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct State
{
int a,b,c;
struct State *prev;
}State;
typedef struct Node
{
State *state;
struct Node *next;
}Node;
Node *create_Node(State *state)
{
Node *node=malloc(sizeof(Node));
node->state=state;
node->next=NULL;
return node;
}
typedef struct Queue
{
Node *front;
Node *rear;
}Queue;
Queue *create_queue(void)
{
Queue *queue=malloc(sizeof(Queue));
queue->front=NULL;
queue->rear=NULL;
return queue;
}
bool isEmpty(Queue *queue)
{
return queue->front==NULL;
}
void pushQueue(Queue *queue,State *state)
{
Node *node=create_Node(state);
if(isEmpty(queue))
{
queue->front=node;
queue->rear=node;
}
else
{
queue->rear->next=node;
queue->rear=node;
}
}
State *popQueue(Queue *queue)
{
if(isEmpty(queue))return NULL;
Node *temp=queue->front;
State *state=temp->state;
queue->front=queue->front->next;
if(queue->front==NULL)queue->rear=NULL;
free(temp);
return state;
}
void clearQueue(Queue *queue) {
while (!isEmpty(queue)) {
State *state = popQueue(queue);
free(state);
}
free(queue);
}
bool isVisited(State *state,bool visited[4][6][9])
{
return visited[state->a][state->b][state->c];
}
void Visited(State *state,bool visited[4][6][9])
{
visited[state->a][state->b][state->c]=true;
}
void printfState(State *state)
{
if(state==NULL)return;
printfState(state->prev);
printf("(A: %d ,B: %d ,C: %d)\n",state->a,state->b,state->c);
}
void tryPour(Queue* queue, State *current, int from, int to, int capacities[3], bool visited[4][6][9])
{
int bottles[3]={current->a,current->b,current->c};
int pourAmount=(bottles[from]<capacities[to]-bottles[to]) ? bottles[from] : capacities[to]-bottles[to];
bottles[from]-=pourAmount;
bottles[to]+=pourAmount;
State *newstate=malloc(sizeof(State));
newstate->a=bottles[0];
newstate->b=bottles[1];
newstate->c=bottles[2];
newstate->prev=current;
if(!isVisited(newstate,visited))
{
pushQueue(queue,newstate);
Visited(newstate,visited);
}
else
free(newstate);
}
void bfs(State *start,int capacities[3])
{
bool visited[4][6][9]={false};
Queue *queue=create_queue();
pushQueue(queue,start);
Visited(start,visited);
while(!isEmpty(queue))
{
State *current=popQueue(queue);
if(current->b==4&¤t->c==4)
{
printfState(current);
clearQueue(queue);
return;
}
tryPour(queue,current,0,1,capacities,visited);
tryPour(queue,current,0,2,capacities,visited);
tryPour(queue,current,1,0,capacities,visited);
tryPour(queue,current,1,2,capacities,visited);
tryPour(queue,current,2,0,capacities,visited);
tryPour(queue,current,2,1,capacities,visited);
}
printf("没有找到方法!");
clearQueue(queue);
}
int main(int argc,const char* argv[])
{
int capacities[3]={3,5,8};
State *start=malloc(sizeof(State));
start->a=3;
start->b=5;
start->c=0;
start->prev=NULL;
bfs(start,capacities);
free(start);
return 0;
}