当前位置:编程学习 > C/C++ >>

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

追问:我就坐在你后面的右边的右边
答案:你是学OI的吗?如果不是请忽视我。

怎么跑这里来问。

倒酒问题是BFS类型的题目。

定义一个队列,可以枚举每次倒酒的4种情况,加入队列。就是做宽搜。

需要源码可以找我。

这种题,就应该和谐掉
100分给我把

#include<iostream.h>
#include <stdlib.h>
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");
}
  

 

定义一个 stdlib.h  函数。

你应该定义一个stdlib.h  函数。

以下是源码:

#include<iostream.h>
#include <stdlib.h>
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;
     }
    

上一个:职工工资管理系统课程设计c++
下一个:编程序创建一个类模板 用c++

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,