洛谷 P1432 倒水问题
程序员文章站
2022-09-27 23:15:51
[TOC] 题目 "戳" 思路 $bfs$ 第一遍提交$50$,第二遍就$100$了,qwq $Code$ cpp include include include include include using namespace std; int t,ca,cb,n,step,sum; int a_n ......
目录
题目
思路
$bfs$
第一遍提交$50$,第二遍就$100$了,qwq
$code$
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cstdio> using namespace std; int t,ca,cb,n,step,sum; int a_now[100001],b_now[100001],flag[100001];//a_now、b_now分别记录a、b壶中的水,flag判断当前这一步是从哪里扩展来的 int ans[100001],qwq[100001];//ans存储进行了哪一步操作,qwq是最后的答案 bool vis[1001][1001];//判断是否到达过当前情况 inline int read(){ int x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f?-x:x; }//读优 inline void write(int x){ if(x<0) putchar('-'),write(-x); else {if(x/10)write(x/10);putchar(x%10+'0');} }//输出 void js(int x){ if(flag[x]){ js(flag[x]),step++; qwq[++sum]=ans[x]; } return; }//计算用了几步以及分别是那几步 void bfs(int a,int b){ int head=0,tail=1; flag[tail]=0; a_now[tail]=a; b_now[tail]=b; vis[a][b]=1; while(head<tail){ head++; for(register int i=1;i<=6;++i){ if(i==1){ int c=ca,d=b_now[head]; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c,b_now[tail]=d; flag[tail]=head; if(d==n){js(tail);return;} } }//1操作:filla 意为给a灌满水 if(i==2){ int c=a_now[head],d=cb; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c,b_now[tail]=d; flag[tail]=head; if(d==n){js(tail);return;} } }//2操作:fill b if(i==3){ int c=0,d=b_now[head]; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c,b_now[tail]=d; flag[tail]=head; if(d==n){js(tail);return;} } }//3操作:empty a 意为将a中水倒空 if(i==4){ int c=a_now[head],d=0; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c,b_now[tail]=d; flag[tail]=head; if(d==n){js(tail);return;} } }//4操作:empty b if(i==5){ int c,d,cha=ca-a_now[head]; if(cha>=b_now[head]) d=0,c=a_now[head]+b_now[head]; else c=ca,d=b_now[head]-cha; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c,b_now[tail]=d; flag[tail]=head; if(d==n){ js(tail); return; } } }//5操作:pour ba 意为将b中水倒到a中(直到a满或者b中水没有剩余) if(i==6){ int c,d; int cha=cb-b_now[head]; if(cha>=a_now[head]) c=0,d=b_now[head]+a_now[head]; else c=a_now[head]-cha,d=cb; if(!vis[c][d]){ vis[c][d]=1; tail++,ans[tail]=i; a_now[tail]=c; b_now[tail]=d; flag[tail]=head; if(d==n){ js(tail); return; } } }//6操作:pour a b } } } int main(){ t=read(); while(t--){ ca=read(),cb=read(),n=read(); bfs(0,0);//搜索 printf("%d ",step);//输出有几步 for(register int i=1;i<=step;++i){//输出答案 write(qwq[i]); printf(" "); //printf("%d ",qwq[i]); } puts("");//换行 step=sum=0; memset(vis,0,sizeof(vis));//初始化 } return 0; }
上一篇: 响应式网页之媒体查询
下一篇: Workerman启动与停止相关命令