zoukankan      html  css  js  c++  java
  • 3414Pots

    不知道是谁出这道题的...坑爹,又是一开始错,没怎么改动,接着又通过了

    我的代码ACCEPT

    #include "iostream"
    #include "queue"
    #include "algorithm"
    #include "string.h"
    using namespace std;
    struct Point{
      int a,b,count;
      int list[1000];
    };
    int min(int a,int b){return a>b?b:a;}
    Point tem,ans;
    int A,B,C;
    char rea[6][20]={{"FILL(2)"},{"FILL(1)"},{"DROP(2)"},{"DROP(1)"},{"POUR(1,2)"},{"POUR(2,1)"}};
    
    void pour(int a){
      int x=tem.a+tem.b;
      if(a==1){
        ans.b=x>B?B:x;
        ans.a=x-ans.b;
      }
      else{
        ans.a=x>A?A:x;
        ans.b=x-ans.a;
      }
    }
    int dir[6][2]={{0,1},{1,0},{0,-1},{-1,0},{2,3},{3,2}};
    
    int main(){
      int i,j,map[110][110],flag=0;
      cin>>A>>B>>C;
      memset(map,0,sizeof(map));
      Point pt;
      pt.a=0;pt.b=0;pt.count=1;
      queue<Point> q;
      q.push(pt);
      while(!q.empty()){
        tem=q.front();
        q.pop();
        if(map[tem.a][tem.b]==1)continue;
        map[tem.a][tem.b]=1;
        //cout<<tem.a<<' '<<tem.b<<' '<<tem.count<<endl;system("pause");
        for(i=0;i<6;i++){
          if(i==0){ans.a=tem.a;ans.b=B;tem.list[tem.count]=0;}
          else if(i==1){ans.a=A;ans.b=tem.b;tem.list[tem.count]=1;}
          else if(i==2){ans.a=tem.a;ans.b=0;tem.list[tem.count]=2;}
          else if(i==3){ans.a=0;ans.b=tem.b;tem.list[tem.count]=3;}
          else if(i==4){pour(1);tem.list[tem.count]=4;}
          else {pour(-1);tem.list[tem.count]=5;}
          ans.count=tem.count+1;
          for(j=1;j<ans.count;j++){ans.list[j]=tem.list[j];}
          //cout<<ans.a<<' '<<ans.b<<' '<<ans.count<<endl;system("pause");
          q.push(ans);
          if(ans.a==C||ans.b==C){flag=1;goto l1;}
        }
        //cout<<endl<<endl;
      }
    l1:if(flag){cout<<ans.count-1<<endl;for(i=1;i<ans.count;i++)cout<<rea[ans.list[i]]<<endl;}
       else cout<<"impossible"<<endl;
    }

    人家的代码,也不错,不用queue,直接用数组

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #define Min(a,b)a<b?a:b
    #define MAX 105
    using namespace std;
    int a,b,c;
    bool vs[MAX][MAX];
    char str[6][10]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)",
                 "POUR(1,2)","POUR(2,1)"};
    struct node
    {
        int ope,a,b,step;
        node *pre;
    }qu[MAX*MAX];
    
    void print(node now)//输出很有技巧  看一大神的思路
    {
        if(now.pre!=NULL)
        {
           print(*now.pre);
           printf("%s
    ",str[now.ope]);
        }
    
    }
    
    void bfs()//六种操作
    {
        int beg=0,end=0;
        qu[beg].a=qu[beg].b=0;
        qu[beg].step=0;
        qu[beg].pre=NULL;
        while(beg<=end)
        {
            node t=qu[beg];
            if(t.a==c||t.b==c)
            {
                printf("%d
    ",t.step);
                print(t);
                return ;
            }
    
            if(!vs[a][t.b])
            {
               end++;
               qu[end].ope=0;
               qu[end].a=a;
               qu[end].b=t.b;
               qu[end].step=t.step+1;
               qu[end].pre=&qu[beg];
               vs[a][t.b]=1;
            }
            if(!vs[t.a][b])
            {
                end++;
                qu[end].ope=1;
                qu[end].a=t.a;
                qu[end].b=b;
                qu[end].step=t.step+1;
                qu[end].pre=&qu[beg];
                vs[t.a][b]=1;
            }
            if(!vs[0][t.b])
            {
               end++;
               qu[end].ope=2;
               qu[end].a=0;
               qu[end].b=t.b;
               qu[end].step=t.step+1;
               qu[end].pre=&qu[beg];
               vs[0][t.b]=1;
            }
            if(!vs[t.a][0])
            {
                end++;
                qu[end].ope=3;
                qu[end].a=t.a;
                qu[end].b=0;
                qu[end].step=t.step+1;
                qu[end].pre=&qu[beg];
                vs[t.a][0]=1;
            }
            int min1=Min(t.a,b-t.b);
            if(!vs[t.a-min1][t.b+min1])
            {
                end++;
                qu[end].ope=4;
                qu[end].a=t.a-min1;
                qu[end].b=t.b+min1;
                qu[end].step=t.step+1;
                qu[end].pre=&qu[beg];
                vs[t.a-min1][t.b+min1]=1;
            }
            int min2=Min(a-t.a,t.b);
            if(!vs[t.a+min2][t.b-min2])
            {
               end++;
               qu[end].ope=5;
               qu[end].a=t.a+min2;
               qu[end].b=t.b-min2;
               qu[end].step=t.step+1;
               qu[end].pre=&qu[beg];
               vs[t.a+min2][t.b-min2]=1;
            }
            beg++;
        }
         printf("impossible
    ");
         return ;
    }
    
    int main()
    {
        scanf("%d%d%d",&a,&b,&c);
        memset(vs,0,sizeof(vs));
        bfs();
    
        return 0;
    }
  • 相关阅读:
    form的get与post方式的区别(转)
    html中DIV+CSS与TABLE布局方式的区别及HTML5新加入的结构标签(转)
    HTML简介
    数据库设计 三范式
    索引与视图
    算法训练 连续正整数的和
    算法训练 寂寞的数
    算法训练 学做菜
    算法训练 猴子分苹果
    算法训练 A+B problem
  • 原文地址:https://www.cnblogs.com/dowson/p/3346943.html
Copyright © 2011-2022 走看看