poj 3414 Pots 链式存储

2023-11-08 12:38
文章标签 存储 poj 链式 3414 pots

本文主要是介绍poj 3414 Pots 链式存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.题意:有两个罐子A,B,可以进行三种操作,

  1. FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap;//把第i个罐子装满;
  2. DROP(i)      empty the pot i to the drain;//把第i个罐子清空;
  3. POUR(i,j)    pour from pot i to pot j; after this operation either the potj is full (and there may be some water left in the poti), or the poti is empty (and all its contents have been moved to the potj).//把第i个罐子的水倒入第j个罐子里,当且仅当有一个罐子满了或者有一个罐子空了;

编写程序使得经过n次操作后,有一个罐子里剩c升水;

Sample Input

3 5 4

样例三个数分别代表两个罐子的水体积,和最终要剩的体积数!

2.思路:bfs,此题与以前不同在于链式存储,不是构图。

3.代码:

#include<stdio.h>
#include<string.h>
struct node
{int a;int b;int parent;int level;int op;
} pot[1000000];
//int pre[100];
int stk[1000000];
int visit[205][205];
void output(int p)
{int top=0;stk[0]=p;while(pot[stk[top]].parent!=-1){top++;stk[top]=pot[stk[top-1]].parent;}for(int i=top; i>=0; i--){//printf("####%d\n",pot[stk[i]].op);switch(pot[stk[i]].op){case 0:{printf("DROP(1)\n");}break;case 1:{printf("FILL(1)\n");}break;case 2:{printf("DROP(2)\n");}break;case 3:{printf("FILL(2)\n");}break;case 4:{printf("POUR(1,2)\n");}break;case 5:{printf("POUR(2,1)\n");}break;}}
}void bfs(int A,int B,int C)
{node cur;pot[0].a=0;pot[0].b=0;pot[0].parent=-1;pot[0].level=0;pot[0].op=-1;//pre[0]=-1;int front=0;int rear=1;visit[0][0]=1;int locate=-1,ans;while(front<rear){cur=pot[front++];if(cur.a==C||cur.b==C){ans=cur.level;locate=front-1;//printf("locate=%d\n",locate);break ;}int ta,tb,tp;for(int i=0; i<6; i++){if(i==0){ta=0;tb=cur.b;tp=i;}if(i==1){ta=A;tb=cur.b;tp=i;}if(i==2){tb=0;ta=cur.a;tp=i;}if(i==3){tb=B;ta=cur.a;tp=i;}if(i==4){if((B-cur.b)>=cur.a){ta=0;tb=cur.a+cur.b;tp=i;}else{ta=cur.a-(B-cur.b);tb=B;tp=i;}}if(i==5){if((A-cur.a)>=cur.b){tb=0;ta=cur.a+cur.b;tp=i;}else{ta=A;tb=cur.b-(A-cur.a);tp=i;}}if(visit[ta][tb]==0){visit[ta][tb]=1;node change;change.a=ta;change.b=tb;change.parent=front-1;change.level=cur.level+1;change.op=tp;//printf("%d,%d,%d,%d,%d\n",change.a,change.b,change.parent,change.op,change.level);pot[rear++]=change;}}}if(locate==-1){printf("impossible\n");}else{printf("%d\n",ans);output(locate);}
}
int main()
{int A,B,C;scanf("%d%d%d",&A,&B,&C);memset(visit,0,sizeof(visit));bfs(A,B,C);return 0;
}


 

这篇关于poj 3414 Pots 链式存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369904

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n