HDU 2416 Treasure of the Chimp Island

游戏开发与技术美术的深度探索
本文深入探讨了游戏开发领域中技术美术的关键角色与实践,从游戏引擎选择、艺术资源管理到特效制作,全面解析如何提升游戏视觉体验。

Treasure of the Chimp Island

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 231    Accepted Submission(s): 108


Problem Description
Bob Bennett, the young adventurer, has found the map to the treasure of the Chimp Island, where the ghost zombie pirate LeChimp, the infamous evil pirate of the Caribbeans has hidden somewhere inside the Zimbu Memorial Monument (ZM 2). ZM 2 is made up of a number of corridors forming a maze. To protect the treasure, LeChimp has placed a number of stone blocks inside the corridors to block the way to the treasure. The map shows the hardness of each stone block which determines how long it takes to destroy the block. ZM 2 has a number of gates on the boundary from which Bob can enter the corridors. Fortunately, there may be a pack of dynamites at some gates, so that if Bob enters from such a gate, he may take the pack with him. Each pack has a number of dynamites that can be used to destroy the stone blocks in a much shorter time. Once entered, Bob cannot exit ZM 2 and enter again, nor can he walk on the area of other gates (so, he cannot pick more than one pack of dynamites).

The hardness of the stone blocks is an integer between 1 and 9, showing the number of days required to destroy the block. We neglect the time required to travel inside the corridors. Using a dynamite, Bob can destroy a block almost immediately, so we can ignore the time required for it too. The problem is to find the minimum time at which Bob can reach the treasure. He may choose any gate he wants to enter ZM 2.
 

Input
The input consists of multiple test cases. Each test case contains the map of ZM 2 viewed from the above. The map is a rectangular matrix of characters. Bob can move in four directions up, down, left, and right, but cannot move diagonally. He cannot enter a location shown by asterisk characters (*), even using all his dynamites! The character ($) shows the location of the treasure. A digit character (between 1 and 9) shows a stone block of hardness equal to the value of the digit. A hash sign (#) which can appear only on the boundary of the map indicates a gate without a dynamite pack. An uppercase letter on the boundary shows a gate with a pack of dynamites. The letter A shows there is one dynamite in the pack, B shows there are two dynamite in the pack and so on. All other characters on the boundary of the map are asterisks. Corridors are indicated by dots (.). There is a blank line after each test case. The width and the height of the map are at least 3 and at most 100 characters. The last line of the input contains two dash characters (--).
 

Output
For each test case, write a single line containing a number showing the minimum number of days it takes Bob to reach the treasure, if possible. If the treasure is unreachable, write IMPOSSIBLE.
 

Sample Input
  
*****#********* *.1....4..$...* *..***..2.....* *..2..*****..2* *..3..******37A *****9..56....* *.....******..* ***CA********** ***** *$3** *.2** ***#* --
 

Sample Output
  
1 IMPOSSIBLE
 

Source
 

Recommend
lcy

这道题还是很不错的练习搜索的题。

题意:给你一张地图,找出找到宝藏的最少时间。

刚开始的状态表示没有用三维,只是考虑到从不同的门BFS一次,然后比较得出

最小值。刚开始把路过的石头的状态用数组记录在结点里,直接导致TLE。

后来也看了些题解,搜索的时候把身上带的炸药个数考虑进去,对于每个点,将

炸与不炸分开讨论,最后比较得出最小值。

AC代码(内附注释)

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<string>
#define N 20000000
using namespace std;
int n,m,ss;//ss用于存最小时间
int a[105][105][30];//状态数组,第3维是带的炸药个数,前2个是坐标。
string map[105];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//用于变换坐标
struct node
{
	int x,y;
	int k,time;//k是携带的炸药包,time是到这里所花的时间
	//重载<运算符,用于优先队列的实现
	friend bool operator < (const node a,const node b)
	{
		return a.time>b.time;
	}
}w,v;
priority_queue<node> q;
bool check(int x,int y)//边境检查
{
	if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='*')
		return 1;
	return 0;
}
void bfs()
{
	memset(a,-1,sizeof(a));
	for(int i=0;i<n;i++)//找出所有的门并加入队列
	{
		for(int j=0;j<m;j++)
		{
			if(map[i][j]=='#')
			{
				w.x=i;w.y=j;
				w.time=0;w.k=0;
				map[i][j]='*';
				q.push(w);
			}
			else if(map[i][j]>='A'&&map[i][j]<='Z')
			{
				w.x=i;w.y=j;
				w.time=0;
				w.k=map[i][j]-'A'+1;
				map[i][j]='*';
				q.push(w);
			}
		}
	}
	while(!q.empty())
	{
		v=q.top();
		q.pop();
		for(int i=0;i<4;i++)
		{
			w.x=v.x+dir[i][0];
			w.y=v.y+dir[i][1];
			if(!check(w.x,w.y))
				continue;
			if(map[w.x][w.y]=='.')//如果是路,直接走过去
			{
				w.k=v.k;
				//如果携带w.k个炸药在x,y点的状态没有检查过
				//或者以前的走法没有现在的走法优
				if(a[w.x][w.y][w.k]==-1||a[w.x][w.y][w.k]>v.time)
				{
					w.time=v.time;
					a[w.x][w.y][w.k]=w.time;
					q.push(w);
				}
			}
			else if(map[w.x][w.y]>='1'&&map[w.x][w.y]<='9')
			{
				//炸这个石头
				if(v.k>0&&(a[w.x][w.y][v.k-1]==-1||a[w.x][w.y][v.k-1]>v.time))
				{
					w.k=v.k-1;
					w.time=v.time;
					a[w.x][w.y][w.k]=w.time;
					q.push(w);
				}
				//不炸这个石头
				if(a[w.x][w.y][v.k]==-1||a[w.x][w.y][v.k]>v.time+map[w.x][w.y]-'0')
				{
					w.k=v.k;
					w.time=v.time+map[w.x][w.y]-'0';
					a[w.x][w.y][w.k]=w.time;
					q.push(w);
				}
			}
			else if(map[w.x][w.y]=='$'&&v.time<ss)
			{
				ss=v.time;
			}
		}
	}
}
int main()
{
	while(getline(cin,map[0])&&map[0][0]!='-')
	{
		int i=1;
		while(getline(cin,map[i])&&map[i].size()!=0)
			i++;
		n=i;
		m=map[0].size();
        ss=N;
		bfs();
		if(ss==N)
			printf("IMPOSSIBLE\n");
		else
			printf("%d\n",ss);
	}
	return 0;
}


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值