100分求c++大牛!!
倒酒问题
Time Limit:1000MS Memory Limit:65536K
Total Submit:149 Accepted:79
Description
有一个大酒瓶和三个容量分别为a,b,c两的大酒杯,主人把容量为a的酒杯倒满后,两个客人提出大家先各喝一两,而且要主人先喝,这样就要求主人通过三个酒杯最后能在容量为b,c的酒杯中各倒上一两酒(主人可先喝倒出来的一两,可以将酒倒入酒瓶,但不可以从酒瓶中倒出)
Input
第1行:3个整数a,b,c表示三个酒杯的容量,(a,b,c均小于100,且b < a, c < a)
Output
若干行,每行表示从出始状态到目标状态的一个中间状态。
每行用4个整数a,b,c,d表示。a,b,c三个酒杯的酒量,d表示国王,没有喝酒时用0表示,喝过后用1表示。
如果找不到倒酒方案,则输出no solution
Sample Input
4 3 1
Sample Output
1:4 0 0 0 2:0 3 0 1 3:0 2 1 1 4:1 2 0 1 5:1 1 1 1
Source
我的程序
#include<iostream>
using namespace std;
struct iii
{
int a,b,c,d;
int front;
}w[100000];
int l=0,r=1;
bool used[110][110][110][2];
int cnt=0;
void _printf(int aa)
{
if(aa==1)
{
printf("%d:%d %d %d %d\n",++cnt,w[aa].a,w[aa].b,w[aa].c,w[aa].d);
return;
}
_printf(w[aa].front);
printf("%d:%d %d %d %d\n",++cnt,w[aa].a,w[aa].b,w[aa].c,w[aa].d);
}
void atb(int a,int b,int c,int &w,int &x,int &y,int full)//a->b
{
w=a-min(a,full-b);
x=b+min(a,full-b);
y=c;
}
void add(int a,int b,int c,int d)
{
if(((a==1)||(b==1)||(c==1))&&(d==0))
{
d=1;
if(a==1) a=0;
else if(b==1) b=0;
else if(c==1) c=0;
}
w[++r].a=a;
w[r].b=b;
w[r].c=c;
w[r].d=d;
w[r].front=l;
if(b==1&&c==1&&d==1)
{
_printf(r);
//system("pause");
exit(0);
}
used[a][b][c][d]=1;
return;
}
int main()
{
int a1,b1,c1;
cin>>a1>>b1>>c1;
w[1].a=a1;
w[1].b=0;
w[1].c=0;
w[1].d=0;
w[1].front=0;
used[a1][0][0][0]=1;
while(l<r)
{
l++;
int a=w[l].a,b=w[l].b,c=w[l].c,d=w[l].d;
int x=0,y=0,z=0;
if(a>0)
{
atb(a,b,c,x,y,z,b1);
if(!used[x][y][z][d])
add(x,y,z,d);
atb(a,c,b,x,z,y,c1);
if(!used[x][y][z][d])
add(x,y,z,d);
if(!used[0][y][z][d])
add(0,y,z,d);
}
if(b>0)
{
atb(b,a,c,y,x,z,a1);
if(!used[x][y][z][d])
add(x,y,z,d);
atb(b,c,a,y,z,x,c1);
if(!used[x][y][z][d])
add(x,y,z,d);
if(!used[x][0][z][d])
add(x,0,z,d);
}
if(c>0)
{
atb(c,a,b,z,x,y,a1);
if(!used[x][y][z][d])
add(x,y,z,d);
atb(c,b,a,z,y,x,b1);
if(!used[x][y][z][d])
add(x,y,z,d);
if(!used[x][y][0][d])
add(x,y,0,d);
}
}
printf("no solution\n");
//system("pause");
return 0;
}
哪里错了啊!!!!!!!!!求大牛!!!!
补充:Sample Output
1:4 0 0 0
2:0 3 0 1
3:0 2 1 1
4:1 2 0 1
5:1 1 1 1
追问:我就坐在你后面的右边的右边