poj3414 Pots

来源:互联网 发布:视频监控网络服务器 编辑:程序博客网 时间:2024/06/05 23:24

题意:有两个无刻度的容量分别为A,B升的杯子,通过一些操作使某一个杯子中有C升的水。

1. FILL(i) ,将i这个杯子中的水接满
2. DROP(i),将i这个杯子中的水倒掉
3. POUR(i,j),将i这个杯子中的水倒入j这个杯子,能倒完就倒完,倒不完就留在杯子中。

问达到目标状态的操作次数最少的方案是什么?

思路:BFS+路径输出。共六种操作FILL(1),FILL(2),DROP(1),DROP(2),POUR(1,2),POUR(2,1)。路径另外去开一个数组去存来的方向就好了。如3 4这状态是由0 4来的,path[3][4]里面存0 4。

//#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int MAXN = 105;int A, B, C;struct state//状态{    int a, b, step;}NOW, NEXT;struct PATH//路径{    int a, b, op;}path[MAXN][MAXN];void putout(int x,int y)//路径输出{    if (x == 0 && y == 0) return ;    putout(path[x][y].a, path[x][y].b);    if (path[x][y].op == 1) printf("FILL(1)\n");    else if (path[x][y].op == 2) printf("FILL(2)\n");    else if (path[x][y].op == 3) printf("DROP(1)\n");    else if (path[x][y].op == 4) printf("DROP(2)\n");    else if (path[x][y].op == 5) printf("POUR(1,2)\n");    else if (path[x][y].op == 6) printf("POUR(2,1)\n");}bool vis[MAXN][MAXN];bool bfs(){    memset(vis, 0, sizeof(vis));    NOW.a = 0, NOW.b = 0, NOW.step = 0; vis[0][0] = true;    queue<state> q;    q.push(NOW);    while (!q.empty())    {        NOW = q.front();        q.pop();        if (NOW.a == C || NOW.b == C)//输出答案        {            printf("%d\n",NOW.step);            putout(NOW.a, NOW.b);            return true;        }//FILL(i)        //FILL(1)        NEXT.a = A; NEXT.b = NOW.b; NEXT.step = NOW.step + 1;        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 1;//记录操作        }        //FILL(2)        NEXT.a = NOW.a; NEXT.b = B; NEXT.step = NOW.step + 1;        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 2;//记录操作        }//DROP(i)        //DROP(1)        NEXT.a = 0; NEXT.b = NOW.b; NEXT.step = NOW.step + 1;        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 3;//记录操作        }        //DROP(2)        NEXT.a = NOW.a; NEXT.b = 0; NEXT.step = NOW.step + 1;        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 4;//记录操作        }//POUR(i,j)        //POUR(1,2)        if (NOW.a >= B - NOW.b)//i能把j倒满        {            NEXT.a = NOW.a - (B - NOW.b); NEXT.b = B; NEXT.step = NOW.step + 1;        }        else //倒不满j        {            NEXT.a = 0; NEXT.b = NOW.b + NOW.a; NEXT.step = NOW.step + 1;        }        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 5;//记录操作        }        //POUR(2,1)        if (NOW.b >= A - NOW.a)//j能把i倒满        {            NEXT.a = A; NEXT.b = NOW.b - (A - NOW.a); NEXT.step = NOW.step + 1;        }        else //倒不满i        {            NEXT.a = NOW.a + NOW.b; NEXT.b = 0; NEXT.step = NOW.step + 1;        }        if (!vis[NEXT.a][NEXT.b])        {            vis[NEXT.a][NEXT.b] = true;            q.push(NEXT);            path[NEXT.a][NEXT.b].a = NOW.a; path[NEXT.a][NEXT.b].b = NOW.b;//记录路径            path[NEXT.a][NEXT.b].op = 6;//记录操作        }    }    return false;}int main(){    while (~scanf("%d%d%d", &A, &B, &C))    {        if (bfs() == false) printf("impossible\n");    }    return 0;}/*3 4 5*//*第一个样例解释:3 5 4         i  jFILL(2)       0  5POUR(2,1)     3  2DROP(1)       0  2POUR(2,1)     2  0FILL(2)       2  5POUR(2,1)     3  4*/





阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 榆林百姓问政平台 韶关市网络问政网站 梧州零距离问政登录入口 榆林百姓问政网站 列子汤问伯牙善鼓琴 问答库 360问答首页 问答平台 问答系统 有奖问答 问答网站 知识问答 旅游问答 装修问答 数学问答 医院问答 英语问答 问答机器人 医疗问答 问答软件 汽车问答 中医问答 自考问答 问答社区 医学问答 主客问答 儿童问答 摇篮问答 情侣问答 问问问答 历史问答 念奴娇鸟儿问答 问答库网页版 皮肤科在线问答 好医生在线问答 中医在线问答 智能问答系统 儿童知识问答 问答魔法学园 在线问答产科医生 知识问答软件