帮忙求解 ITAT复赛的题目 看了半天不知道什意思
1、编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升?要求以如下格式打印出分水步骤。(20分)
a12 b8 c5
12 0 0
* * * ( “*”表示当前状态下每个容器的盛水量)
......
0 6 6
[解决办法]
写了一下,真辛苦,那么长。、、
#include <stdio.h>#include <stdlib.h>#include <string.h>#define NUM_STATES 2000//static States' pooltypedef int States[3];States stPool[NUM_STATES];int preStates[NUM_STATES];States done[3]={ {6,6,0},{6,0,6},{0,6,6}};int curUsed;//------------------------#define NUM_BUCKETS 16//States hashtypedef int BucketHead;BucketHead hashList[NUM_BUCKETS];int next[NUM_STATES];//-----------------------#define QUEUE_SIZE 2000int cirQueue[QUEUE_SIZE];int front,rear,size;void globInit(){ curUsed=front=rear=size=0; memset(hashList,-1,sizeof(BucketHead)*NUM_BUCKETS); memset(next,-1,sizeof(int)*NUM_STATES);}int hash(States st){ return st[0]*3+st[1]*2+st[2];}bool find(States st){ int bucket=hash(st)%NUM_BUCKETS; int curNode=hashList[bucket]; while(curNode!=-1) { if(memcmp(stPool[curNode],st,sizeof(States))==0) { return true; } curNode=next[curNode]; } return false;}int insert(States st){ bool isExist=find(st); if(!isExist) { int bucket=hash(st)%NUM_BUCKETS; memcpy(stPool[curUsed],st,sizeof(States)); next[curUsed]=hashList[bucket]; hashList[bucket]=curUsed; return curUsed++; } return -1;}void push(int index){ cirQueue[rear]=index; rear=(rear+1)%QUEUE_SIZE; ++size;}int pop(){ int index=cirQueue[front]; front=(front+1)%QUEUE_SIZE; --size; return index;}void printResult(int curIndex){ if(curIndex==-1) { return; } printResult(preStates[curIndex]); for(int i=0;i<3;++i) { printf("%d ",stPool[curIndex][i]); } printf("\n");}void bfsSearch(int *water,int *space){ States frontSt; int leftSpace[3]={0}; memcpy(frontSt,water,sizeof(States)); int index=insert(frontSt); preStates[index]=-1; push(index); while(size!=0) { index=pop(); memcpy(frontSt,stPool[index],sizeof(States)); for(int i=0;i<3;++i) { if(memcmp(done[i],stPool[index],sizeof(States))==0) { printResult(index); return; } leftSpace[i]=space[i]-frontSt[i]; } for(int i=0;i<3;++i) { int waterI=frontSt[i]; for(int j=0;j<3;++j) { if(j!=i) { int minWater=waterI<leftSpace[j] ? waterI:leftSpace[j]; States temp; memcpy(temp,frontSt,sizeof(States)); temp[i]-=minWater; temp[j]+=minWater; int ret=insert(temp); if(ret!=-1) { preStates[ret]=index; push(ret); } } } } } }int main(){ int water[3]={12,0,0}; int space[3]={12,5,8}; globInit(); printf("space:\n12 5 8\n=======\n"); bfsSearch(water,space); return 0;}