#include "stdio.h"
#include "queue"
#include "cstring"
using namespace std;
struct node{
int num[3];
int output;
}now,nex;
int vis[101][101][101];
int rq[3];//最大容量
bool check(node x){
if((x.num[0] == x.num[1] && x.num[2] == 0 )||(x.num[0] == x.num[2] && x.num[1] == 0)||
(x.num[1] == x.num[2] && x.num[0] == 0)){
return true;
}
return false;
}
void bfs(int ss, int n, int m){
queue<node>s;
memset(vis,0,sizeof(vis));
now.num[0] = ss;
now.num[1] = n;
now.num[2] = m;
vis[ss][n][m] = 1; //记录当前的这种情况我已经访问了
now.output = 0; //记录层数
s.push(now);
while(!s.empty()){
now = s.front();
if(check(now)){
printf("%d\n",now.output);
return ;
}
s.pop();
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(i == j) continue;
if(now.num[i] <= rq[j]-now.num[j]){//如果能倒光
nex.num[j] = now.num[j] + now.num[i];
nex.num[i] = 0;
}
else{//如果不能倒光
nex.num[i] = now.num[i] - (rq[j]-now.num[j]);
nex.num[j] = rq[j];
}
//另外一个不变
for(int ii=0;ii<3;ii++)
{
if(ii==i||ii==j)
continue;
nex.num[ii]=now.num[ii];
}
//层次加一 ,千万别写成now.output++!!!
nex.output = now.output + 1;
//记忆化状态
if(vis[nex.num[0]][nex.num[1]][nex.num[2]]==0){
vis[nex.num[0]][nex.num[1]][nex.num[2]]=1;
s.push(nex);
}
}
}
}
printf("NO\n");
return ;
}
int main(){
int s, n, m;
while(scanf("%d%d%d",&s,&n,&m)!=EOF && s!=0 && n!=0 && m!=0){
if(s & 1){
printf("NO\n");
}
else {
rq[0] = s;
rq[1] = n;
rq[2] = m;
bfs(s,0,0);
}
}
return 0;
}
这里注意的是会结构体中++是对.后面的加加,而不是整体,还有题目的理解很重要。本体是BFS的经典题型。