hdu5025 状态压缩广搜

本文探讨了一个复杂的解救任务问题,目标是在特定时间内最小化完成任务所需的花费。通过采用广搜算法和优先队列,作者设计了一种策略来解决在解救过程中收集钥匙和应对蛇群的挑战。此策略涉及对状态的有效标记和路径搜索,旨在找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
      悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类的钥匙的最小花费时间。


思路:

      应该两种方法吧,感觉很多都是用4维的标记,然后广搜的,我用的是3维的标记,然后优先队列广搜的,题目没啥难的,关键是读懂题,敲代码的时候细心点就行了。mark[x][y][key] 表示在x,y点是要是状态是key是否走过。


#include<stdio.h>
#include<string.h>
#include<queue>

#define N 110

using namespace std;

typedef struct NODE
{
   int x ,y ,key ,t;
   int she;
   friend bool operator < (NODE a ,NODE b)
   {
      return a.t > b.t;
   }     
}NODE;

NODE xin ,tou;
int mark[N][N][1<<10];
int  Map[N][N];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
int ex ,ey ,n ,M;

int BFS(int x ,int y)
{
   priority_queue<NODE>q;
   xin.x = x ,xin.y = y ,xin.t = 0 ,xin.key = 0 ,xin.she = 0;
   memset(mark ,0 ,sizeof(mark));
   mark[xin.x][xin.y][xin.key] = 1;
   q.push(xin);
   while(!q.empty())
   {
      tou = q.top();
      q.pop();
      if(tou.x == ex && tou.y == ey && tou.key == (1 << M) - 1)
      {
         return tou.t;
      }
      for(int i = 0 ;i < 4 ;i ++)
      {
         xin.x = tou.x + dir[i][0];
         xin.y = tou.y + dir[i][1];
         xin.t = tou.t + 1;
         if(xin.x < 1 || xin.x > n || xin.y < 1 || xin.y > n || !Map[xin.x][xin.y])
         continue;
         if(Map[xin.x][xin.y] >= 11) 
         {
            if(tou.she & (1 << (Map[xin.x][xin.y] - 1)))
            xin.she = tou.she;
            else 
            {
                xin.she = tou.she | (1 << (Map[xin.x][xin.y] - 1));                 
                xin.t ++;
             }
         }
         else xin.she = tou.she;
         if(Map[xin.x][xin.y] >= 1 && Map[xin.x][xin.y] <= 9)
         {
            if(Map[xin.x][xin.y] != 1 && !(tou.key & (1 << (Map[xin.x][xin.y] - 2))))
            xin.key = tou.key;
            else
            xin.key = tou.key | (1 << (Map[xin.x][xin.y] - 1));
         }
         else xin.key = tou.key;
         if(!mark[xin.x][xin.y][xin.key])
         {
            mark[xin.x][xin.y][xin.key] = 1;
            q.push(xin);
         }
      }
   }
   return -1;
}

int main ()
{
   int i ,j ,x ,y;
   char str[N];
   while(~scanf("%d %d" ,&n ,&M) && n + M)
   {
      int ss = 0;
      for(i = 1 ;i <= n ;i ++)
      {
         scanf("%s" ,str);
         for(j = 0 ;j < n ;j ++)
         {
            if(str[j] == 'K')
            {
               x = i ,y = j + 1;
               Map[x][y] = 10;
            }
            if(str[j] == 'T')
            {
               ex = i ,ey = j + 1;
               Map[ex][ey] = 10;
            }
            if(str[j] == '.') 
            Map[i][j+1] = 10;
            if(str[j] == '#')
            Map[i][j+1] = 0;
            if(str[j] >= '1' && str[j] <= '9')
            Map[i][j+1] = str[j] - '0';
            if(str[j] == 'S')
            {
               ss++;
               Map[i][j+1] = 10 + ss;
             }
         }
      }
      int Ans = BFS(x ,y);
      if(Ans == -1) puts("impossible");
      else printf("%d\n" ,Ans);
   }
   return 0;
}





内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值