SSL_1104 城堡(The Castle)

本文介绍了一种使用广度优先搜索解决洛谷1457问题的方法,通过计算每个房间的最大面积及拆除墙壁后的最大价值。代码实现详细展示了如何遍历地图并更新房间编号,最终找到最优解。

题目:


思路:

    我们可以用广搜找出每一个房间的面积和房间数,然后枚举每一个墙的拆掉的最大值和坐标。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int x,n,m,wall[51][51][5],mj[51],fh[51][51],fj,tail,head,state[2501][3],maxans,ansx,ansy;
char answ;
short dx[4]={1,-1,0,0},dy[4]={0,0,-1,1};
bool check(int x,int y,int xx,int yy)
{
    if (xx<1||xx>n||yy<1||yy>m) return false;
    if (xx-1==x&&yy==y&&!wall[xx][yy][1]) return true;
    if (xx+1==x&&yy==y&&!wall[xx][yy][2]) return true;
    if (xx==x&&yy-1==y&&!wall[xx][yy][3]) return true;
    if (xx==x&&yy+1==y&&!wall[xx][yy][4]) return true;
    return false;
}
void bfs(int x,int y)
{
    if (fh[x][y]>0) return;//fh代表(i,j)所属的房间号,如果这里有值就代表搜过了,就不用搜了
    tail=1;head=0;fj++;//fj代表这是第几个房间号
    fh[x][y]=fj;
    state[1][1]=x;
    state[1][2]=y;//赋初值
    int xx,yy;
    do
    {
        head++;
        for (int i=0;i<=3;i++)
          {
          	   xx=state[head][1]+dx[i];yy=state[head][2]+dy[i];
          	   if (check(state[head][1],state[head][2],xx,yy)&&!fh[xx][yy])//判断当前这个点能否到新坐标,而且新坐标没有被统计过
          	   {
          	   	    tail++;
          	   	    state[tail][1]=xx;
          	   	    state[tail][2]=yy;
          	   	    fh[xx][yy]=fj;
          	   }
          }
    
    }while (head<tail);
}
int main()
{
    scanf("%d%d",&m,&n);
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++)
        {
        	scanf("%d",&x);//因为读入的是1,2,4,8的和,所以我们这样做
                if (x>=8){x-=8;wall[i][j][2]=1;}//1,2,3,4分别代表北南东西墙,wall[i][j][]是代表这个坐标的北南东西有没有墙
        	if (x>=4){x-=4;wall[i][j][4]=1;}
        	if (x>=2){x-=2;wall[i][j][1]=1;}
        	if (x>=1){x-=1;wall[i][j][3]=1;}
        }
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++)
        {
        	bfs(i,j);//广搜出面积和房间号
        	mj[fj]=tail;
        	maxans=max(maxans,tail);//统计最大的面积
        }
    printf("%d\n%d\n",fj,maxans);
    maxans=0;ansy=2100000000;ansx=-1;
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++)//这里是求拆墙的最优解
      {
       if (fh[i][j]!=fh[i][j-1])//如果它西边的房间和它不是一个的,而且
      	  if(mj[fh[i][j]]+mj[fh[i][j-1]]>maxans||//把这墙拆掉比最优解大的,或者
            (mj[fh[i][j]]+mj[fh[i][j-1]]==maxans&&j<ansy)||//它等于最优解,但更靠西的,或者
            (mj[fh[i][j]]+mj[fh[i][j-1]]==maxans&&j-1==ansy&&i>ansx))//它和上一个答案一样西,但是更靠南
      	    {maxans=mj[fh[i][j]]+mj[fh[i][j-1]];ansx=i;ansy=j-1;answ='E';}//存下最优解,因为我们是东边求过来的,所以j要-1
       if (fh[i][j]!=fh[i-1][j])//这里和上面差不多
          if(mj[fh[i][j]]+mj[fh[i-1][j]]>maxans||
            (mj[fh[i][j]]+mj[fh[i-1][j]]==maxans&&j<ansy)||
            (mj[fh[i][j]]+mj[fh[i-1][j]]==maxans&&j==ansy&&i>ansx))
      	    {maxans=mj[fh[i][j]]+mj[fh[i-1][j]];ansx=i;ansy=j;answ='N';}//存下最优解
      }
    printf("%d\n%d %d %c",maxans,ansx,ansy,answ);
}


 
内容概要:本文研究了一种基于改进ICEEMDAN的火电-蓄电池-飞轮混合储能联合调频协同控制策略,旨在提升电力系统频率调节的快速响应能力与运行稳定性。通过引入改进的自适应噪声完备集合经验模态分解(ICEEMDAN)方法,对电网频率偏差信号进行多时间尺度分解,精确分离高频与低频动态分量,并据此实现功率的差异化分配:高频成分由响应迅速的飞轮储能承担,低频成分由能量密度高的蓄电池处理,同时结合火电机组的基础调频能力,构建火电-混合储能多源协同控制架构。该策略充分发挥各类储能技术的优势,有效缓解单一储能系统的压力,延长设备寿命,并提升系统整体调频性能。文中提供了完整的Matlab仿真代码实现,验证了该方法在抑制频率波动、优化储能出力、提高系统可靠性和经济性方面的显著效果。; 适合人群:具备电力系统分析、自动控制理论及新能源技术等相关专业知识背景,熟悉Matlab/Simulink仿真平台,从事电力系统调频控制、混合储能系统优化、多时间尺度能量管理等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入研究混合储能系统在电网一次调频与二次调频中的功率分配机制与协调控制逻辑;②掌握ICEEMDAN信号分解技术在能源系统动态特征提取与多尺度控制中的应用方法;③实现火电机组与多类型储能协同参与调频的仿真建模、算法开发与性能对比分析;④为综合能源系统、微电网及新型电力系统的多源多时间尺度协调控制提供理论依据与技术参考。; 阅读建议:建议结合提供的Matlab代码逐模块分析算法实现流程,重点理解信号分解、模态分量判别、功率分配规则及控制器设计等关键环节,可通过调整系统参数、模拟不同扰动工况进行仿真测试,进一步开展灵敏度分析与策略优化,以深化对协同控制机理的认识并拓展其实际应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值