首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

帮忙求解 ITAT复赛的题目 看了半天不知道什意思,该怎么解决

2012-05-14 
帮忙求解ITAT复赛的题目 看了半天不知道什意思1、编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升

帮忙求解 ITAT复赛的题目 看了半天不知道什意思
1、编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升?要求以如下格式打印出分水步骤。(20分)
  a12 b8 c5
  12 0 0
  * * * ( “*”表示当前状态下每个容器的盛水量)
  ......
  0 6 6

[解决办法]
写了一下,真辛苦,那么长。、、

C/C++ code
#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;} 

热点排行