bfs专题之HUD 1429 胜利大逃亡(续)

本文解析了HDU 1429题目中的BFS算法实现细节,重点介绍了如何利用位运算记录钥匙状态,并通过三维数组进行状态压缩来避免重复访问同一状态。文中提供了一个完整的C语言实现代码示例。

http://acm.hdu.edu.cn/showproblem.php?pid=1429

第一次做 感觉有点困难 毕竟接触 BFS不久

两点值得学习

1,记录10把钥匙的状态 即vis[][][1024]的 作用   1024  (2^10)中状态  。。。状态   学长 屡次强调 且 屡次解释 的一个 东西

每种状态只能走一个点一次  这是和 最简单迷宫的 区别  。。

2,位运算  >>  <<  &  |       这与上面的1024相对应 ,作为新手这个的确不大熟悉 。。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
    int x,y;
    int step,key;
}dui[5000000];
int s_x,s_y,e_x,e_y,t;
int n,m;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
char map[25][25];
int mark[25][25][1025];
int bfs()
{
    int i,j,head,tail;
    int key;
    struct node now,next;
    head=tail=0;
    dui[tail].x=s_x;
    dui[tail].y=s_y;
    dui[tail].step=0;
    dui[tail++].key=0;
    while(head<tail)
    {
        now.x=dui[head].x;
        now.y=dui[head].y;
        now.step=dui[head].step;
        now.key=dui[head++].key;
        for(i=0;i<4;i++)
        {
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
            next.step=now.step+1;
            next.key=now.key;
            if(next.x<0 || next.x>=n ||next.y<0 || next.y>=m) continue;
            if(map[next.x][next.y]=='*') continue;
            if(map[next.x][next.y]>='a' && map[next.x][next.y]<='j')
            {
                key=1<<(map[next.x][next.y]-'a');
                next.key=next.key|key;
            }
            else if(map[next.x][next.y]>='A' && map[next.x][next.y]<='J')
            {
                key=1<<(map[next.x][next.y]-'A');
                if( (key&next.key)==0 ) continue;
            }
           if(mark[next.x][next.y][next.key]) continue;
           mark[next.x][next.y][next.key]=1;
           if(next.x==e_x && next.y==e_y)
           {
               if(next.step<t) return next.step;
               else return -1;
           }
           dui[tail].x=next.x;
           dui[tail].y=next.y;
           dui[tail].step=next.step;
           dui[tail++].key=next.key;
        }
    }
    return -1;
}
int main()
{
    int i,j;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        getchar();
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='@')
                {
                    s_x=i; s_y=j;
                }
                else if(map[i][j]=='^')
                {
                    e_x=i; e_y=j;
                }
            }
            getchar();
        }
        memset(mark,0,sizeof(mark));
        printf("%d\n",bfs());
    }
    return 0;
}

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值