非常可乐
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2446 Accepted Submission(s): 1023
7 4 3 4 1 3 0 0 0
NO 3
#include<iostream>
#include<stdio.h>
#include<mem.h>
using namespace std;
struct node
{
int t[3];
int step;
}a[10000];
int b[102][102][102];
int main()
{
int s,m,n,i,j,p;
while(~scanf("%d%d%d",&s,&m,&n))
{
if(s==0&&m==0&&n==0)break;
if(s%2!=0)
{
printf("%s\n","NO");
continue;
}
bool xx=false;
int st[]={s,m,n};
int start=0,end=0,k=1;
a[0].t[0]=s;
a[0].t[1]=0;
a[0].t[2]=0;
a[0].step=0;
p=s/2;
memset(b,false,sizeof(b));
b[a[0].t[0]][0][0]=true;
while(start<=end)
{
if((a[start].t[0]==p&&a[start].t[1]==p)||(a[start].t[0]==p&&a[start].t[2]==p)||(a[start].t[2]==p&&a[start].t[1]==p))
{
printf("%d\n",a[start].step);
xx=true;
break;
}
for(i=0;i<3;i++)
{
if(a[start].t[i]==0)continue;
for(j=0;j<3;j++)
{
if(i==j)continue;
a[k]=a[start];
//printf("%d %d %d %d %d\n",a[k].t[0],a[k].t[1],a[k].t[2],a[k].step,b[a[k].t[0]][a[k].t[1]][a[k].t[2]]);
if(a[k].t[i]<=st[j]-a[k].t[j])
{
a[k].t[j]=a[k].t[j]+a[k].t[i];
a[k].t[i]=0;
}
else
{
a[k].t[i]=a[k].t[i]-(st[j]-a[k].t[j]);
a[k].t[j]=st[j];
}
if(b[a[k].t[0]][a[k].t[1]][a[k].t[2]]==false)
{
b[a[k].t[0]][a[k].t[1]][a[k].t[2]]=true;
a[k].step++;
//printf("%s %d %d %d %d %d\n","__________",a[k].t[0],a[k].t[1],a[k].t[2],a[k].step,b[a[k].t[0]][a[k].t[1]][a[k].t[2]]);
k++;
end++;
}
}
}
start++;
}
if(xx==false)printf("%s\n","NO");
}
}