文章目录

  • AC代码
  • TLE ???为啥啊?不知道哪里不对,导致超时
  • 对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = 。。。

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=105;
bool v[4];
bool vis[maxn][maxn][maxn];
struct Node
{int v[4];int step;
} temp;//倒水函数,把a杯子中的可乐倒到b杯子中
void pour(int a,int b)
{int sum=temp.v[a]+temp.v[b];if(sum>=v[b])temp.v[b]=v[b];elsetemp.v[b]=sum;temp.v[a]=sum-temp.v[b];
}
void BFS()
{queue<Node>q;Node now;now.v[0]=v[0];now.v[1]=0;now.v[2]=0;now.step=0;q.push(now);memset(vis,false,sizeof(vis));vis[v[0]][0][0]=true;while(!q.empty()){now=q.front();q.pop();if(now.v[0]==now.v[2]&&now.v[1]==0){cout<<now.step<<endl;return;}for(int i=0; i<3; i++){for(int j=0; j<3; j++){if(i!=j)//自己不倒水给自己{temp=now;//每个水位情况都要把所有操作枚举一遍,//所以都要赋值为原始水位情况pour(i,j);if(!vis[temp.v[0]][temp.v[1]][temp.v[2]]){temp.step++;q.push(temp);vis[temp.v[0]][temp.v[1]][temp.v[2]]=true;}}}}}cout<<"NO"<<endl;
}
int main()
{while(scanf("%d%d%d",&v[0],&v[1],&v[2])!=EOF){if(v[0]+v[1]+v[2]==0)break;if(v[1]>v[2])swap(v[1],v[2]);BFS();}return 0;
}

TLE ???为啥啊?不知道哪里不对,导致超时

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 110;
struct node
{int v[3];//0,1,2号, 三个杯子里的情况int step;
};
queue<node> q;
int v[3];//v[0]=s;v[1]=n;v[2]=m;
int vis[maxn][maxn][maxn];void pour(node &x, int a, int b)//a号杯子里的水倒入b号杯子中
{int sum = x.v[a] + x.v[b];if (sum >= v[b])x.v[b] = v[b];elsex.v[b] = sum;x.v[a] = sum - x.v[b];//总数减去变化后的v[b],即为v[a];
}
void bfs()
{while (!q.empty())q.pop();memset(vis, 0, sizeof(vis));node t;t.v[0] = v[0]; t.v[1] = 0; t.v[2] = 0; t.step = 0;q.push(t);vis[v[0]][0][0] = 1;while (!q.empty()){node now = q.front(); q.pop();if (now.v[0] == now.v[1] && now.v[2] == 0)//s=n+m. n!=m. 所以要想等分,,必须s杯子里的水和n,m二者里的一个容量较大的相等{cout << now.step << endl;return;}for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (i != j){node next = now;pour(next, i, j);if (!vis[next.v[0]][next.v[1]][next.v[2]]){next.step++;q.push(next);vis[next.v[0]][next.v[1]][next.v[2]]=1;}}}}}cout << "NO" << endl;
}int main()
{while (cin >> v[0] >> v[1] >> v[2]){if (v[0] == 0 && v[1] == 0 && v[2] == 0)break;if (v[1] < v[2])swap(v[1], v[2]);bfs();}return 0;
}

对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = 。。。

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 110;
struct node
{int v[3];//0,1,2号, 三个杯子里的情况int step;
};
queue<node> q;
bool v[3];//v[0]=s;v[1]=n;v[2]=m;
bool vis[maxn][maxn][maxn];
node temp;
void pour(int a, int b)//a号杯子里的水倒入b号杯子中
{int sum = temp.v[a] + temp.v[b];if (sum >= v[b])temp.v[b] = v[b];elsetemp.v[b] = sum;temp.v[a] = sum - temp.v[b];//总数减去变化后的v[b],即为v[a];
}
//void pour(node x, int a, int b)//a号杯子里的水倒入b号杯子中
//{//  int sum = x.v[a] + x.v[b];
//  if (sum >= v[b])
//      x.v[b] = v[b];
//  else
//      x.v[b] = sum;
//  x.v[a] = sum - x.v[b];//总数减去变化后的v[b],即为v[a];
//}
void bfs()
{while (!q.empty())q.pop();memset(vis, 0, sizeof(vis));node t;t.v[0] = v[0]; t.v[1] = 0; t.v[2] = 0; t.step = 0;q.push(t);vis[v[0]][0][0] = 1;while (!q.empty()){node now = q.front(); q.pop();if (now.v[0] == now.v[1] && now.v[2] == 0)//s=n+m. n!=m. 所以要想等分,,必须s杯子里的水和n,m二者里的一个容量较大的相等//if (now.v[0] == now.v[2] && now.v[1] == 0){cout << now.step << endl;return;}for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (i != j){/*node next = now;pour(next, i, j);*/temp = now;pour(i, j);/*if (!vis[next.v[0]][next.v[1]][next.v[2]]){next.step++;q.push(next);vis[next.v[0]][next.v[1]][next.v[2]] = 1;}*/if (!vis[temp.v[0]][temp.v[1]][temp.v[2]]){temp.step++;q.push(temp);vis[temp.v[0]][temp.v[1]][temp.v[2]] = 1;}}}}}cout << "NO" << endl;
}int main()
{//while (cin >> v[0] >> v[1] >> v[2])while (scanf("%d%d%d", &v[0], &v[1], &v[2]) != EOF){if (v[0] == 0 && v[1] == 0 && v[2] == 0)break;if (v[1] < v[2])swap(v[1], v[2]);/*if (v[1] > v[2])swap(v[1], v[2]);*/bfs();}return 0;
}

hdu 1495非常可乐 BFS相关推荐

  1. hdu 1495 非常可乐 (bfs)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. HDU 1495 非常可乐(BFS||数论)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. HDU - 1495 非常可乐(BFS,数学)

    HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...

  4. HDU 1495 非常可乐

    - HDU 1495 - 非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和 ...

  5. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. Hdu 1495 非常可乐、BFS、模拟:【题解】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descri ...

  7. hdu 1495 非常可乐(BFS)

    题目链接:hdu1495 共有6种操作,x-->y,x-->z,y-->x,y-->z,z-->x,z-->y #include<stdio.h> #i ...

  8. HDU 1495 非常可乐

    非常可乐 http://acm.hdu.edu.cn/showproblem.php?pid=1495 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. HDU 1495(非常可乐)

    Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且 ...

最新文章

  1. Ollydbg 编写脚本的一些语法及例子(OD脚本)
  2. MASK-RCNN学习一:(数据集/原理介绍)
  3. SpringAOP中通过JoinPoint获取值,并且实现redis注解
  4. mysql 互为主从复制常见问题
  5. Moodle插件开发笔记
  6. laravel queue(消息队列)的使用实例
  7. SPSS——相关分析——偏相关(Partial)分析
  8. 电子公文流转暨无纸办公系统
  9. Arcface训练vgg2face数据集——数据制作
  10. 【Oracle】userenv()函数介绍分析
  11. 一款非常好用的Markdown文档编辑器Typora
  12. 核心期刊《法医学杂志》
  13. oim failed_对OIM Web(UI)层进行压力测试
  14. 360搜索用上了so.com域名
  15. 达梦dm8可视化工具_活字格兼容达梦DM8,低代码支持数据库国产化
  16. Auto CAD2010下载地址及图文安装教程(带注册机)
  17. Crack看雪论坛加解密的一个破解案例程序
  18. 批量提取文件名的方法
  19. latex 各种表格
  20. 重磅!中国工程院院士孙家广加盟昆仑数据,担任首席战略顾问

热门文章

  1. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口
  2. Python与R的争锋:大数据初学者该怎样选?
  3. 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA
  4. HTML的DOM和浏览器的BOM
  5. Gradle[1]gradle distZip时,增加目录信息到zip中
  6. Asp.net开发环境的设置所遇到的问题
  7. Java基础——注解的初步认识
  8. C语言课后习题(28)
  9. linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)[转]
  10. openmv 神经网络 超出内存_【openmv】openmv各种bug问题记录