编程实现,有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升

来源:互联网 发布:ios数据存储方式 编辑:程序博客网 时间:2024/04/30 22:22
1、编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升?要求以如下格式打印出分水步骤。(20分)
   a12  b8  c5
   12   0    0

   *     *     * ( “*”表示当前状态下每个容器的盛水量)

   .    .     .

   .    .     .

   6      6      0

使用DFS:

#include <stdio.h>typedef struct container{int size;int present;} container;struct statu{container cont[3];}status[50];void saveStatus(struct statu *status1,struct statu *status2){for(int i=0;i<3;i++){status2->cont[i]=status1->cont[i];}}int is_repeat(struct statu status[],int num){for(int i=0;i<=num;i++)if(status[i].cont[0].present==status[num+1].cont[0].present && status[i].cont[1].present==status[num+1].cont[1].present ) return 0;return 1;}int search(struct statu status[],int num){static int count;int i,j;for(i=0;i<3;i++){for(j=0;j<3;j++){if(i==j) continue;//zijihezijiif(status[num].cont[i].present==0) break;if(status[num].cont[j].present==status[num].cont[j].size) continue;saveStatus(&status[num],&status[num+1]);if((status[num].cont[i].present+status[num].cont[j].present)<=status[num].cont[j].size){status[num+1].cont[j].present+=status[num+1].cont[i].present;status[num+1].cont[i].present=0;}else{status[num+1].cont[i].present-=status[num+1].cont[j].size-status[num+1].cont[j].present;status[num+1].cont[j].present=status[num+1].cont[j].size;}if(is_repeat(status,num)==0) continue;if(status[num+1].cont[0].present==6 && status[num+1].cont[1].present==6){printf("共有%d多少种方法:\n",++count);for(int k=0;k<num+2;k++){printf("步骤%d:%d %d %d\n",k+1,status[k].cont[0].present,status[k].cont[1].present,status[k].cont[2].present);}}search(status,num+1);}}}int main(){container a12={12,12},b7={7,0},c5={5,0};status[0].cont[0]=a12;status[0].cont[1]=b7;status[0].cont[2]=c5;if(!search(status,0)) printf("此题无解\n");return 0;}