poj3414_bfs

题意:这个题以前见过,但是从没有用代码实现过,题意就是,给出两个杯子的容量,求是否可以通过fill,drop,pour,一系列操作,最后得出某一个容量的液体,如果可以则输出最少步数和操作过程,如果不能输出impossible

分析:

这题用bfs,考虑6钟转化过程,这个代码写的有点长。在输出操作过程的时候要递归。

然后就是数据结构的使用了,1A了,感觉不错。

代码:

View Code
  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <cstring>
  4 #include <queue>
  5 using namespace std;
  6 const int maxnum=101;
  7 bool use[maxnum][maxnum];
  8 //196K    0MS  3945B
  9 struct node
 10 {
 11     int x,y;
 12     int ans;
 13     int parent;
 14     int my;
 15     int flag;
 16 }list[maxnum*maxnum];
 17 queue<struct node> q;
 18 
 19 void digui(int u)
 20 {
 21     if(list[u].parent==-1)
 22         return ;
 23     digui(list[u].parent);
 24     if(list[u].flag==11)
 25         printf("FILL(1)\n");
 26     else if(list[u].flag==12)
 27         printf("FILL(2)\n");
 28     else if(list[u].flag==21)
 29         printf("DROP(1)\n");
 30     else if(list[u].flag==22)
 31         printf("DROP(2)\n");
 32     else if(list[u].flag==31)
 33         printf("POUR(1,2)\n");
 34     else if(list[u].flag==32)
 35         printf("POUR(2,1)\n");
 36 }
 37 
 38 int main()
 39 {
 40     int a,b,c,cnt;
 41     scanf("%d%d%d",&a,&b,&c);
 42     memset(use,false,sizeof(use));
 43     use[0][0]=true;
 44     cnt=0;
 45     list[cnt].x=0,list[cnt].y=0,list[cnt].ans=0,list[cnt].parent=-1,list[cnt].my=0;
 46     cnt++;
 47     q.push(list[0]);
 48     struct node temp;
 49     while(!q.empty())
 50     {
 51         temp=q.front();
 52         if(temp.x==c ||temp.y==c)
 53             break;
 54         q.pop();
 55         if(temp.x<a && !use[a][temp.y])
 56         {
 57             use[a][temp.y]=true;
 58             list[cnt].x=a,list[cnt].y=temp.y,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=11;
 59             q.push(list[cnt]);
 60             cnt++;
 61         }
 62         if(temp.y<b && !use[temp.x][b])
 63         {
 64             use[temp.x][b]=true;
 65             list[cnt].x=temp.x,list[cnt].y=b,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=12;
 66             q.push(list[cnt]);
 67             cnt++;
 68         }
 69         if(temp.x>0 && !use[0][temp.y])
 70         {
 71             use[0][temp.y]=true;
 72             list[cnt].x=0,list[cnt].y=temp.y,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=21;
 73             q.push(list[cnt]);
 74             cnt++;
 75         }
 76         if(temp.y>0 &&!use[temp.x][0])
 77         {
 78             use[temp.x][0]=true;
 79             list[cnt].x=temp.x,list[cnt].y=0,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=22;
 80             q.push(list[cnt]);
 81             cnt++;
 82         }
 83         if(temp.x>0 && temp.y<b)
 84         {
 85             if(temp.x>=b-temp.y && !use[temp.x-b+temp.y][b])
 86             {
 87                 use[temp.x-b+temp.y][b]=true;
 88                 list[cnt].x=temp.x-b+temp.y,list[cnt].y=b,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=31;
 89                 q.push(list[cnt]);
 90                 cnt++;
 91             }
 92             else if(temp.x<b-temp.y && !use[0][temp.y+temp.x])
 93             {
 94                 use[0][temp.y+temp.x]=true;
 95                 list[cnt].x=0,list[cnt].y=temp.y+temp.x,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=31;
 96                 q.push(list[cnt]);
 97                 cnt++;
 98             }
 99         }
100         if(temp.x<a && temp.y>0)
101         {
102             if(temp.y>=a-temp.x && !use[a][temp.y-a+temp.x])
103             {
104                 use[a][temp.y-a+temp.x]=true;
105                 list[cnt].x=a,list[cnt].y=temp.y-a+temp.x,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=32;
106                 q.push(list[cnt]);
107                 cnt++;
108             }
109             else if(temp.y<a-temp.x && !use[temp.x+temp.y][0])
110             {
111                 use[temp.x+temp.y][0]=true;
112                 list[cnt].x=temp.x+temp.y,list[cnt].y=0,list[cnt].ans=temp.ans+1,list[cnt].my=cnt,list[cnt].parent=temp.my,list[cnt].flag=32;
113                 q.push(list[cnt]);
114                 cnt++;
115             }
116         }
117     }
118     if(q.empty())
119         printf("impossible\n");
120     else
121     {
122         printf("%d\n",temp.ans);
123         digui(temp.my);
124     }
125 
126     return 0;
127 }
128 
129 /*
130 3 5 4
131 */

 

posted @ 2012-09-26 10:27  pushing my way  阅读(311)  评论(0编辑  收藏  举报