kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495

探讨了使用两个不同容量的杯子和一罐满可乐,如何通过相互倾倒将可乐平均分成两份的问题。采用广度优先搜索算法,模拟六种可能的倾倒情况,寻找最少的操作次数。

非常可乐 HDU - 1495

题目链接:https://vjudge.net/problem/HDU-1495

题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两种情况:
(1) A全部倒入B中,B中的升数小于等于B的最大容量。
(2)A部分倒入B中,B已经到达了B的最大容量。
问:有没有可能把S升的可乐平分在任意两个容器中,有的话得出最少操作次数,否则输出“NO”。

思路:bfs,把六种情况都模拟枚举(代码写的比较形象),需要标记出现过的三个容器的容量情况,否则会TLE。

#include <iostream>
#include <cstring>
#include<vector>
#include<string>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;

#define inf (1LL << 31) - 1
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--)

int NL, ML, SL, AVE;
//bool vis[110][110][110];

struct node{

	int N, M, S, V;

	node(int a, int b, int c, int d){
		N = a;
		M = b;
		S = c;
		V = d;
	}
	
	//这里面内嵌的  if表示(1)情况
	//             else表示(2)情况
	void Pour(int f, int s){

		if (f == 1){
			if (s == 2){
				int t = ML - M;
				if (N >= t) N -= t, M = ML; //(1)
				else M += N, N = 0; //(2)
			}
			else if (s == 3){
				int t = SL - S;
				if (N >= t) N -= t, S = SL;
				else S += N, N = 0;
			}
		}
		else if (f == 2){
			if (s == 1){
				int t = NL - N;
				if (M >= t) M -= t, N = NL;
				else N += M, M = 0;
			}
			else if (s == 3){
				int t = SL - S;
				if (M >= t) M -= t, S = SL;
				else S += M, M = 0;
			}
		}
		else if (f == 3){
			if (s == 1){
				int t = NL - N;
				if (S >= t) S -= t, N = NL;
				else N += S, M = 0;
			}
			else if (s == 2){
				int t = ML - M;
				if (S >= t) S -= t, M = ML;
				else M += S, S = 0;
			}
		}
	}

};

//可以看出,我用了两个方法都可以标记情况
void bfs(){

	map<pair<int, int>, bool> mp;//标记三个容器的容量情况,防止出下过的再次出现在队列中
	pair<int, int > p(0, 0);
	mp[p] = true;
	node in(0, 0, SL, 0);
//	vis[in.N][in.M][in.S] = true;
	queue<node> que;
	que.push(in);

	while (!que.empty()){

		node tmp = que.front();
		que.pop();
		
		//六种情况,Pour(x,y) 把X中的倒入y中,应该是很清楚了
		rep(i, 1, 6){
			node t = tmp;

			if (i == 1) t.Pour(1, 2);
			else if (i == 2) t.Pour(1, 3);
			else if (i == 3) t.Pour(2, 1);
			else if (i == 4) t.Pour(2, 3);
			else if (i == 5) t.Pour(3, 1);
			else if (i == 6) t.Pour(3, 2);
			
			//检查有没有出现平分了
			int key = 0;
			if (t.N == AVE) key++;
			if (t.M == AVE) key++;
			if (t.S == AVE) key++;
			//平分了
			if (key >= 2){
				cout << tmp.V + 1 << endl;
				return;
			}

			p.first = t.N;
			p.second = t.M;
			pair<int, int > p(t.N, t.M);
			if (!mp[p]/*!vis[t.N][t.M][t.S]*/){
				mp[p] = true;
			//	vis[t.N][t.M][t.S] = true;
				que.push(node{ t.N, t.M, t.S, tmp.V + 1 });
			}
		}
	}

	cout << "NO" << endl;
}

int main(){

	ios::sync_with_stdio(false);
	cin.tie(0);

	while (cin >> SL >> NL >> ML){

		memset(vis, 0, sizeof(vis));

		if (NL == 0 && ML == 0 && SL == 0) break;
		AVE = SL / 2;
		if (SL & 1){
			cout << "NO" << endl;
			continue;
		}
		bfs();
	}

	return 0;
}
内容概要:本文介绍了基于改进Retinex算法的视频图像增强技术研究,并提供了相应的Matlab代码实现。Retinex理论源于人类视觉系统对光照变化的适应性,通过分离图像的照度与反射分量,有效提升图像的亮度、对比度和色彩保真度。文中所提出的改进算法旨在克服传统Retinex方法中存在的光晕伪影、噪声放大和计算复杂等问题,可能引入了如多尺度分解、颜色校正或自适应滤波等优化策略,从而实现更自然、清晰的图像增强效果。该研究特别适用于低光照、雾霾、水下拍摄等恶劣成像条件下的视频与图像处理,提升后续视觉分析的准确性。; 适合人群:具备定图像处理基础和Matlab编程经验的科研人员、研究生及工程技术人员,尤其是从事计算机视觉、视频监控、遥感影像、医学影像或无人机视觉导航等领域研究的专业人士。; 使用场景及目标:① 解决实际应用中因光照不足或环境干扰导致的图像质量下降问题;② 学习和掌握Retinex算法的核心思想及其改进方法;③ 获取可直接运行和调试的Matlab代码,作为相关课题研究或项目开发的技术参考。; 阅读建议:此资源以Matlab代码实现为核心,建议读者在阅读时结合代码逐行分析,理解算法的每步实现细节。同时,应尝试使用不同的测试图像进行实验,调整算法参数,观察增强效果的变化,从而深入理解算法的性能特点和优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值