• poj 3414 Pots bfs+模拟


      1 #include<iostream> 
      2 #include<cstring>
      3 #define fillA 1
      4 #define pourAB 2
      5 #define dropA 3
      6 #define fillB 4
      7 #define pourBA 5
      8 #define dropB 6
      9 
     10 #define N 10000
     11 
     12 using namespace std;
     13 int vis[105][105];
     14 class node
     15 {
     16 public:
     17    int A, B;
     18    int dir;
     19    node()
     20    {
     21       A=0;
     22       B=0;
     23    }
     24 };
     25 
     26 int a, b, c, tot;
     27 node q[N];
     28 int pre[N];
     29 
     30 void printPath(int index)
     31 {
     32    if(index==0)
     33    {
     34        cout<<tot<<endl; 
     35        return ;
     36    } 
     37    ++tot;
     38    printPath(pre[index]);
     39    switch(q[index].dir)
     40    {
     41       case 1:
     42            cout<<"FILL(1)";
     43            break;
     44       case 2:
     45            cout<<"POUR(1,2)";
     46            break;
     47       case 3:
     48            cout<<"DROP(1)";
     49            break;
     50       case 4:
     51            cout<<"FILL(2)";
     52            break;
     53       case 5:
     54            cout<<"POUR(2,1)";
     55            break;
     56       case 6:
     57            cout<<"DROP(2)";
     58            break;
     59    }
     60    cout<<endl;
     61 }
     62 
     63 int bfs()
     64 {
     65    int head=0, rear=1, r;
     66    node cur, next;
     67    memset(vis, 0, sizeof(vis));
     68    pre[0]=0;
     69    vis[0][0]=1;
     70    while(head<rear)
     71    {
     72        cur=q[head];
     73        if(cur.A==c || cur.B==c)
     74        {
     75              printPath(head);
     76              return 1;
     77        }
     78        next=cur;
     79        if(!vis[a][cur.B])//将 A 装满 
     80        {
     81              next.A=a;
     82              next.dir=fillA;
     83              pre[rear]=head;
     84              vis[a][cur.B]=1;
     85              q[rear++]=next;
     86        }
     87        if(!vis[0][cur.B])//将 A 倒掉 
     88        {
     89              next.A=0;
     90              next.dir=dropA;
     91              pre[rear]=head;
     92              vis[0][cur.B]=1;
     93              q[rear++]=next;
     94        }
     95        r=b-cur.B;
     96        next.dir=pourAB;
     97        if(r>cur.A && !vis[0][cur.B+cur.A])//将A 倒向 B 
     98        {
     99              next.A=0;
    100              next.B=cur.B+cur.A;
    101              pre[rear]=head;
    102              q[rear++]=next;
    103              vis[0][cur.B+cur.A]=1;
    104        }
    105        else if(r<=cur.A && !vis[cur.A-r][cur.B+r])
    106        {
    107              next.A=cur.A-r;
    108              next.B=cur.B+r;
    109              pre[rear]=head;
    110              q[rear++]=next;
    111              vis[cur.A-r][cur.B+r]=1;
    112        }
    113        
    114        next=cur;//开始错在这里了, 忘记了从新给next赋值了
    115        if(!vis[cur.A][b])//将 B 装满 
    116        {
    117              next.B=b;
    118              next.dir=fillB;
    119              pre[rear]=head;
    120              q[rear++]=next;
    121              vis[cur.A][b]=1;
    122        }
    123        if(!vis[cur.A][0])//将 B 倒掉 
    124        {
    125              next.B=0;
    126              next.dir=dropB;
    127              pre[rear]=head;
    128              q[rear++]=next;
    129              vis[cur.A][0]=1;
    130        }
    131        r=a-cur.A;
    132        next.dir=pourBA;
    133        if(r>cur.B && !vis[cur.B+cur.A][0])//将B 倒向 A
    134        {
    135              next.B=0;
    136              next.A=cur.B+cur.A;
    137              pre[rear]=head;
    138              q[rear++]=next;
    139              vis[cur.B+cur.A][0]=1;
    140        }
    141        else if(r<=cur.B && !vis[cur.A+r][cur.B-r])
    142        {
    143              next.A=cur.A+r;
    144              next.B=cur.B-r;
    145              pre[rear]=head;
    146              q[rear++]=next;
    147              vis[cur.A+r][cur.B-r]=1;
    148        }
    149       ++head;  
    150    }
    151    return 0;
    152 }
    153 
    154 int main()
    155 {
    156    while(cin>>a>>b>>c)
    157    {
    158       tot=0;
    159       if(c>a && c>b)
    160       {
    161          cout<<"impossible"<<endl;
    162          continue;
    163       }
    164       if(!bfs())
    165          cout<<"impossible"<<endl;
    166    }
    167    return 0;
    168 } 
  • 相关阅读:
    家庭记账本1
    寒假福利5
    寒假福利4——定位功能
    寒假福利3——日期时间选择器
    寒假作业——家庭小账本1.6(总结)
    寒假作业——家庭小账本1.5
    寒假作业——家庭小账本1.4
    寒假作业——家庭小账本1.3
    寒假作业——家庭小账本1.2
    寒假作业——家庭小账本1.1
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3782823.html
Copyright © 2020-2023  润新知