搜索

本文介绍了解决华容道问题的一种算法实现,通过使用结构体存储状态,并利用广度优先搜索(BFS)来寻找从初始状态到目标状态的最短路径。此外,还讨论了如何采用深度优先搜索(DFS)解决生日蛋糕问题,通过剪枝优化搜索过程。

华容道70
设两个变量,记在一个结构体里
在进行爆搜,就是一个普通的bfs,只会简单的爆搜,正解是,三个bfs,先处理出白板到起始的最短距离,在处理出移动的代价,在跑一边最短路;

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
using namespace std;

int n,m,k;
struct stu{
    int x,y,x1,y1,s;
};
int f[31][31][31][31];
int x[4]={
1,-1,0,0};
int y[4]={
0,0,1,-1};
int a[39][39];
int bfs(stu p,int x2,int y2)
{
    queue<stu> q;
    q.push(p);
    memset(f,0,sizeof(f));
    f[p.x][p.y][p.x1][p.y1]=1;
    while(!q.empty())
    {
        stu o=q.front();q.pop();
        if(o.x1==x2&&o.y1==y2)
        return o.s;
        for(int i=0;i<=3;i++)
        {
            stu tmp;
            tmp.x=o.x+x[i];
            tmp.y=o.y+y[i];
            if(o.x1==tmp.x&&o.y1==tmp.y)
            {
                tmp.x1=o.x;
                tmp.y1=o.y;
            }
            else
            {
                tmp.x1=o.x1;
                tmp.y1=o.y1;
            }
            tmp.s=o.s+1;
            if(tmp.x<1||tmp.y<1||tmp.x>n||tmp.y>m||!a[tmp.x][tmp.y]) continue;
            if(!f[tmp.x][tmp.y][tmp.x1][tmp.y1])
            {
                q.push(tmp);
                f[tmp.x][tmp.y][tmp.x1][tmp.y1]=1;
            }
        }

    }
    return -1;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);

    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     scanf("%d",&a[i][j]);

     for(int i=1;i<=k;i++)
     {
         stu p;int x2,y2;
         scanf("%d%d%d%d%d%d",&p.x,&p.y,&p.x1,&p.y1,&x2,&y2);
         p.s=0;
         printf("%d\n",bfs(p,x2,y2));
     }
} 

生日蛋糕
这里写图片描述
进行dfs
起始条件为最大的半径和高,枚举他们,再加一系列剪枝
1.如果当时的面积大于最优解,返回
2.如果所有的体积加起来都不够v,返回
3.如果加上最小的体积都比v大,返回

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int v,m,ans=0x7fffffff,s[29999],max1[99][99][99];
void dfs(int h,int r,int V,int S,int p)
{

    if(S>=ans)return ;

    if(p==m)
    {
        if(V==0)
        ans=min(S,ans);
        return ;
    }

    if(V>max1[p][r][h]) return ;
    for(int j=r-1;j>=m-p;j--)
    for(int i=min(h-1,V/(j*j));i>=m-p;i--)
    dfs(i,j,V-j*j*i,S+2*i*j,p+1);
}
int main()
{
    scanf("%d%d",&v,&m);
    for(int i=m;i>=1;i--)
    s[i]=s[i+1]+i*i*i;
    for(int i=1;i<=sqrt(v);i++)
    for(int j=1;j<=v/(i*i);j++){

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值