首页 > 其他分享 >hdu1495 非常可乐--BFS

hdu1495 非常可乐--BFS

时间:2022-12-06 19:38:48浏览次数:88  
标签:杯中 -- hdu1495 BFS que push visited else true


原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1495​


一:分析

思路:预处理m < n < s,以后处理方便点
初始状态,m,n杯中可乐体积为0,s杯中体积为s;
然后分六种情况:
1, s 倒 m
2, s 倒 n
3, m 倒 n
4, m 倒 s
5, n 倒 m
6, n 倒 s
直到n,s杯中的可乐能等分(此时m杯中体积为0)为止,若不能等分,则输出 NO


二:AC代码

#define _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 101
bool visited[maxn][maxn];
int m, n, s, si, sj;
struct node
{
int x, y, all, t; //x,y,all分别表示m,n,s杯中可乐的体积,t表示倒了多少次
};
void BFS()
{
queue<node> que;
memset(visited, false, sizeof(visited));
node p, q;
p.x = 0, p.y = 0, p.t = 0, p.all = s;
que.push(p);
visited[p.x][p.y] = true;
while (!que.empty())
{
p = que.front();
que.pop();
if (p.y == p.all && p.y == s / 2)
{
printf("%d\n", p.t);
return;
}
if (p.all + p.x > m) //s倒m
{
q.x = m, q.y = p.y, q.all = p.all + p.x - m, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
else
{
q.x = p.all + p.x, q.y = p.y, q.all = 0, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
if (p.all + p.y > n) //s倒n
{
q.x = p.x, q.y = n, q.all = p.all + p.y - n, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
else
{
q.x = p.x, q.y = p.all + p.y, q.all = 0, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
if (p.x + p.y > n) //m倒n
{
q.x = p.x + p.y - n, q.y = n, q.all = p.all, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
else
{
q.x = 0, q.y = p.x + p.y, q.all = p.all, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
q.all = p.all + p.x, q.x = 0, q.y = p.y, q.t = p.t + 1; //m倒s
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
if (p.x + p.y > m)
{
q.y = p.y + p.x - m, q.x = m, q.all = p.all, q.t = p.t + 1;//n倒m
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
else
{
q.x = p.x + p.y, q.y = 0, q.all = p.all, q.t = p.t + 1;
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
q.all = p.all + p.y, q.x = p.x, q.y = 0, q.t = p.t + 1; //n倒s
if (!visited[q.x][q.y])
que.push(q), visited[q.x][q.y] = true;
}
printf("NO\n");
}
int main()
{
while (scanf("%d%d%d", &s, &m, &n) && (s || m || n))
{
if (s % 2)
{
printf("NO\n");
continue;
}
if (m > n) swap(m, n);
BFS();
}
return 0;
}






标签:杯中,--,hdu1495,BFS,que,push,visited,else,true
From: https://blog.51cto.com/u_11937443/5916541

相关文章

  • hdu1253 胜利大逃亡--BFS & BFS的总结
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1253​​一:题意一个三维A*B*C,起点(0,0,0),终点(A-1,B-1,C-1),求在t时间内(包括t)能否到达?可以,输出花费的最少时间,否则......
  • hdu1254 推箱子--BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1254​​一:分析分两步,一是箱子走到终点,二是人得走到箱子的前一个位置。先是bfs_box在t点找到一个可行点tt,进而......
  • hdu1240 Asteroids!--DFS & BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1240​​一:题意三维空间,中o表示可以走,x表示不能走,给出行走的起始点和目的点的坐标,问最少多少步可以从起点到达目......
  • hdu1180 诡异的楼梯--BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1180​​需要注意这句话:Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.#define_CRT_SECURE_NO_DEPRECATE#def......
  • hdu1242 Rescue--BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1242​​一:题意x代表卫兵,a代表终点,r代表起始点,.代表路,#代表墙路花费一秒,x花费两秒问到达终点的最少时间思路:B......
  • 使用Spring Reactor优化推荐流程
    1.背景公司有一个推荐系统Rec,这个系统的主要功能是:向外部系统提供推荐接口根据请求获取推荐策略根据推荐策略完成推荐的召回、过滤、打分、排序阶段Rec作为微服务......
  • hdu1195 Open the Lock--单向BFS & 双向BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1195​​一:题意两个四位数的数字,经过一下三种方式变换,求出变成另一个数字的最小时间。加1;减1;相邻交换其中9+1变......
  • hdu1175 连连看 --DFS/BFS
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1175​​直接上代码,不是很难。#define_CRT_SECURE_NO_DEPRECATE#define_CRT_SECURE_Cy1_OVERLOAD_STANDARD_N......
  • UE4学习笔记23——【动画】Mixamo自动绑骨并导入虚幻4
    P61.Mixamo自动绑骨并导入虚幻4P61需要插件“MixamoAnimationRetargeting”(200多块......)(这节课就简单听听,以后用到了再看)(桥豆麻袋!不用买这个插件,这节课的东西也能......
  • hdu1026 Ignatius and the Princess I --BFS & 记录路径 & 与DFS的比较
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1026​​一:题意一个n*m的矩阵代表一个迷宫,(0,0)是起点,(n-1)(m-1)是终点,每移动一步一秒。迷宫每点意义是:. 该点可以......