宝宝好激动、、、、A个题越来越不易了、、
题意:很经典的小游戏,给你两个杯子和足够的水,问你能不能用这两个杯子量出题目中要求的水的容积;哈哈,有了这个程序以后玩这种小游戏就可以快速找到最佳方案啦啦啦啦
方法,bfs搜索,搜索的对象是两个杯子的状态;每次只能进行一次操作,共有六种可能,用vis数组标记一下是否这种状态已经出现过
get的新技能:如果要记录路径的话可以开一个数组,要记录字符串的话就是二维数组啦;
宝宝写的代码:
#include <stdio.h> #include <string.h> #include <queue> using namespace std; struct node { int x; int y; int z; char str[155][155]; }; int a,b,c; queue<node>q; void bfs() { int vis[111][111]; memset(vis,0,sizeof(vis)); vis[0][0]=1; while(!q.empty()) { node n; n=q.front(); q.pop(); if(n.x==c||n.y==c) { printf("%d ",n.z); for(int i=1; i<=n.z; i++) { printf("%s ",n.str[i]); } return ; } node k; k=n; k.x=0; k.z++; strcpy(k.str[k.z],"DROP(1)"); if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } k=n; k.y=0; k.z++; strcpy(k.str[k.z],"DROP(2)"); if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } k=n; k.x=a; k.z++; strcpy(k.str[k.z],"FILL(1)"); if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } k=n; k.y=b; k.z++; strcpy(k.str[k.z],"FILL(2)"); if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } if((n.x + n.y)<a) { k=n; k.x= n.x + n.y; k.y=0; k.z++; strcpy(k.str[k.z],"POUR(2,1)"); } else { k=n; k.x=a; k.y= n.y+n.x-a; k.z++; strcpy(k.str[k.z],"POUR(2,1)"); } if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } if((n.y+n.x)<b) { k=n; k.y=n.x + n.y; k.x=0; k.z++; strcpy(k.str[k.z],"POUR(1,2)"); } else { k=n; k.y=b; k.x=n.x+n.y-b; k.z++; strcpy(k.str[k.z],"POUR(1,2)"); } if(vis[k.x][k.y]==0) { vis[k.x][k.y]=1; q.push(k); } } printf("impossible "); return ; } int main() { while(~scanf("%d%d%d",&a,&b,&c)) { node n1; n1.x=a; n1.y=0; strcpy(n1.str[1],"FILL(1)"); node n2; n2.x=0; n2.y=b; strcpy(n2.str[1],"FILL(2)"); n1.z=1; n2.z=1; q.push(n1); q.push(n2); bfs(); } return 0; }