貌似uva崩了,现在进不去,所以这道题还判断正确与否,其实无所谓了,我这是看的网上的代码,写的基本上一样,唉,没办法,不会做,又看了网上的题解,认真写理解吧还是。。。
构造了一个结构体,water数组用来保存三个杯子的状态,sum用来保存当前的倒水量,visit数组用来保存状态,以
防他们重复访问,三个杯子只需要两个杯子来判断,第三个已经确定,所以开一个二维数组就可以了。。。然后用
reach数组来存储所有的倒水量,下标是目标水量,值是一共的倒水量。。。
只需要一次BFS最多有200*200种状态,然后从这些状态中找到想要求的目标水量对应的到水量就可以了。。。
二维数组来判断是否重复是个好方法,只可惜我没想出来,。。。。继续加油!!!
另外还出了点bug,找了一上午。。。原来是优先级问题,if语句里面的,以后都老老实实加括号算了。。。
代码:
<span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; int visit[205][205]; int reach[205]; int a[3]; struct state { int water[3]; int sum; }stt,st2; void solve() { for(int k=0; k<3; k++) { if(reach[st2.water[k]] == -1) reach[st2.water[k]] = st2.sum; else if(reach[st2.water[k]] > st2.sum) reach[st2.water[k]] = st2.sum; } return ; } void bfs() { state st1; int i,j; st1.water[0] = 0; st1.water[1] = 0; st1.water[2] = a[2]; st1.sum = 0; reach[0] = reach[a[2]] = 0; visit[0][0] = 1; queue<state>que; que.push(st1); while(!que.empty()) { stt = que.front(); que.pop(); for(i=0; i<3; i++) { for(j=0; j<3; j++) { if(i == j) continue; st2 = stt; int m = a[j] - stt.water[j] > stt.water[i] ? stt.water[i] : a[j] - stt.water[j]; st2.water[i] = stt.water[i] - m; st2.water[j] = stt.water[j] + m; if(!visit[st2.water[0]][st2.water[1]] || reach[st2.water[0]] > (stt.sum + m) || reach[st2.water[1]] > (stt.sum +m )|| reach[st2.water[2]] >(stt.sum +m)) { visit[st2.water[0]][st2.water[1]] = 1; st2.sum = stt.sum + m; solve(); que.push(st2); } } } } return ; } int main() { int T,ans; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&a[0],&a[1],&a[2],&ans); memset(visit,0,sizeof(visit)); memset(reach,-1,sizeof(reach)); bfs(); for(int i=ans; i>=0; i--) { if(reach[i] >= 0) { printf("%d %d\n",reach[i],i); break; } } } return 0; } </span>