标签:
2 6 3 1 4 1 1 9 3 2 7 1 1
3 -1题解:bfs里用两个循环代表从j往i杯子里倒水;
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 struct Node{ 6 int wat[3]; 7 int step; 8 }; 9 int cup[3]; 10 int res[3]; 11 int vis[110][110]; 12 void bfs(int sx,int sy,int sz){ 13 memset(vis,0,sizeof(vis)); 14 queue<Node>dl; 15 Node a,b; 16 a.wat[0]=sx;a.wat[1]=sy;a.wat[2]=sz; 17 vis[sx][sy]=1; 18 a.step=0; 19 dl.push(a); 20 while(!dl.empty()){ 21 a=dl.front(); 22 dl.pop(); 23 if(a.wat[0]==res[0]&&a.wat[1]==res[1]&&a.wat[2]==res[2]){ 24 printf("%d\n",a.step); 25 return; 26 } 27 for(int i=0;i<3;i++) 28 for(int j=0;j<3;j++){ 29 b=a; 30 b.step++; 31 if(i!=j){ 32 //printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]); 33 if(a.wat[j]+a.wat[i]<=cup[i]){ 34 b.wat[i]=a.wat[i]+a.wat[j]; 35 b.wat[j]=0; 36 } 37 else{ 38 b.wat[i]=cup[i]; 39 b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]); 40 } 41 if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2]){ 42 printf("%d\n",b.step); 43 return; 44 } 45 //printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step); 46 if(!vis[b.wat[0]][b.wat[1]])dl.push(b); 47 vis[b.wat[0]][b.wat[1]]=1; 48 } 49 } 50 } 51 puts("-1"); 52 } 53 int main(){ 54 int N; 55 scanf("%d",&N); 56 while(N--){ 57 for(int i=0;i<3;i++)scanf("%d",cup+i); 58 for(int i=0;i<3;i++)scanf("%d",res+i); 59 bfs(cup[0],0,0); 60 } 61 return 0; 62 }
bfs优化:
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 struct Node{ 6 int wat[3]; 7 int step; 8 friend bool operator < (Node a,Node b){ 9 return a.step>b.step; 10 } 11 }; 12 int cup[3]; 13 int res[3]; 14 int vis[110][110]; 15 void bfs(int sx,int sy,int sz){ 16 memset(vis,0,sizeof(vis)); 17 priority_queue<Node>dl; 18 Node a,b; 19 a.wat[0]=sx;a.wat[1]=sy;a.wat[2]=sz; 20 vis[sx][sy]=1; 21 a.step=0; 22 dl.push(a); 23 while(!dl.empty()){ 24 a=dl.top(); 25 dl.pop(); 26 if(a.wat[0]==res[0]&&a.wat[1]==res[1]&&a.wat[2]==res[2]){ 27 printf("%d\n",a.step); 28 return; 29 } 30 for(int i=0;i<3;i++) 31 for(int j=0;j<3;j++){ 32 b=a; 33 b.step++; 34 if(i!=j){ 35 //printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]); 36 if(a.wat[j]+a.wat[i]<=cup[i]){ 37 b.wat[i]=a.wat[i]+a.wat[j]; 38 b.wat[j]=0; 39 } 40 else{ 41 b.wat[i]=cup[i]; 42 b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]); 43 } 44 if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2]){ 45 printf("%d\n",b.step); 46 return; 47 } 48 //printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step); 49 if(!vis[b.wat[0]][b.wat[1]])dl.push(b); 50 vis[b.wat[0]][b.wat[1]]=1; 51 } 52 } 53 } 54 puts("-1"); 55 } 56 int main(){ 57 int N; 58 scanf("%d",&N); 59 while(N--){ 60 for(int i=0;i<3;i++)scanf("%d",cup+i); 61 for(int i=0;i<3;i++)scanf("%d",res+i); 62 bfs(cup[0],0,0); 63 } 64 return 0; 65 }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4845012.html