poj3414_bfs

两杯水问题 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 */

 

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/09/26/2703511.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值