6.3分可乐

在这里插入图片描述

#include 
#include 
using namespace std;
struct node{//状态结构体 int x,y,z;//每个杯子中可乐的体积 s,n,mint t;//所需要时间 
};  
bool halfequal(int x,int y,int z,int c){return (x==float(c)/2&&y==float(c)/2)||(x==float(c)/2&&z==float(c)/2)||(y==float(c)/2&&z==float(c)/2); 
}
queue<node> q;//保存入度为0的节点  
bool mark[101][101][101];//标记数组,一旦处理完就标记其位置为true 
int atob(int &a,int sa,int &b,int sb){//倾倒函数,由初始可乐体积为a,总体积为sa的杯子往初始可乐体积为b,总体积为sb的杯子中倒可乐,到后两者体积为改变后的a,bif(sb-b>=a){//a的可乐可以全部到给b b+=a; a=0; }else{//a的可乐到满b后还有剩余 a-=sb-b;b=sb;} 
}
int bfs(int a,int b,int c){//s n mwhile(!q.empty()){node nowp=q.front();//得到队头状态 q.pop();//弹出队头int x=nowp.x;int y=nowp.y;int z=nowp.z;//读出该状态的s,n,m对应的可乐体积 node tmp;  atob(x,a,y,b);//a向b倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true; tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数 }q.push(tmp); }x=nowp.x;y=nowp.y;z=nowp.z; atob(y,b,x,a);//b向a倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true;tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数  }q.push(tmp);}x=nowp.x;y=nowp.y;z=nowp.z; atob(x,a,z,c);//a向c倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true;tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数 }q.push(tmp);}x=nowp.x;y=nowp.y;z=nowp.z; atob(z,c,x,a);//c向a倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true; tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数 }q.push(tmp);}x=nowp.x;y=nowp.y;z=nowp.z; atob(y,b,z,c);//b向c倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true; tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数 }q.push(tmp); }x=nowp.x;y=nowp.y;z=nowp.z; atob(z,c,y,b);//c向b倒if(!mark[x][y][z]){//若该体积状态未出现过 mark[x][y][z]=true; tmp.x=x;tmp.y=y;tmp.z=z;tmp.t=nowp.t+1;//又倒了一次if(halfequal(x,y,z,a)){return tmp.t;//若该状态已经为平分状态,可直接返回该状态倒的次数 }q.push(tmp); } }return -1;//所有状态都找完都未找到出口坐标,返回-1 
}
int main(){int s,n,m;while(scanf("%d%d%d",&s,&n,&m)!=EOF&&!(s==0&&n==0&&m==0)){for(int i=0;i<s;i++)for(int j=0;j<n;j++)for(int k=0;k<m;k++){mark[i][j][k]=false;//初始化城堡数组即标记数组 }while(!q.empty()) q.pop();//清空队列mark[s][0][0]=true;//标记出发节点 node tmp;tmp.x=s;tmp.y=0;tmp.z=0;tmp.t=0;//初始只有大瓶可乐 q.push(tmp);//出发节点进栈int rec=bfs(s,n,m);if(rec!=-1) printf("%d\n\n",rec);else printf("NO\n\n"); } return 0;
}

7 4 3
4 1 3
0 0 0


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部