Zoj 3865 Superbot

本文介绍了一种利用双BFS算法实现的机器人寻宝路径规划方法。通过控制板设定移动周期,寻找从起点到达藏宝点的最短时间路径。文章详细展示了算法的实现过程及核心代码。

按规则移动机器人 , 问是否能拾得宝藏 。 

加了一个控制板 , 还增加了一个控制板移动周期 p 

将移动周期变换一下 , 移动一次  就相当于光标向左不耗费时间的移动了一格

搜索思路 : 搜索当前格子到上下左右四个格子所花费的最短时间 。

记录光标的信息 , 和当前格子所需最短时间 。

bfs + bfs

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define PI acos(-1.0)
  4 #define MAXN 20
  5 #define INF 0x3f3f3f3f
  6 int p,min_num;
  7 int n,m;
  8 int G[MAXN][MAXN];
  9 int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
 10 struct point
 11 {
 12     int x;
 13     int y;
 14 }start,pos;
 15 struct base
 16 {
 17     int cnt;
 18     int t;
 19 }step[MAXN][MAXN];
 20 int read_ch(int x, int y)
 21 {
 22     char ch;
 23     while(ch = getchar())
 24     {
 25         if(ch == '@')
 26         {
 27             start.x=x;
 28             start.y=y;
 29             return true;
 30         }
 31         if(ch == '.') return true;
 32         if(ch == '$')
 33         {
 34             pos.x=x;
 35             pos.y=y;
 36             return true;
 37         }
 38         if(ch == '*') return false;
 39     }
 40 }
 41 void show()
 42 {
 43     for(int i = 1 ; i <= n ; i ++,cout<<endl)
 44         for(int j = 1 ; j <= m ; j ++)
 45             printf(step[i][j].cnt == INF?"INF ":"%3d ", step[i][j].cnt);
 46     cout<<endl;
 47 }
 48 int bfs(int t,int cnt,int pos)
 49 {
 50     queue <int> Q;
 51     int temp=0;
 52     Q.push(cnt);
 53     Q.push(temp);
 54     while(!Q.empty())
 55     {
 56         int x=Q.front();
 57         Q.pop();
 58         temp=Q.front();
 59         Q.pop();
 60 
 61         if(((t+temp) % p == 0) && (t + temp)) x = (x + 3) % 4;
 62 
 63         Q.push((x+3)%4);
 64         Q.push(temp+1);
 65 
 66         Q.push(x);
 67         Q.push(temp+1);
 68 
 69         Q.push((x+1)%4);
 70         Q.push(temp+1);
 71 
 72         if(x == pos) return t+temp+1;
 73     }
 74     return INF;
 75 }
 76 void _bfs()
 77 {
 78     memset(step,0x3f,sizeof(step));
 79     step[start.x][start.y].cnt=0;
 80     step[start.x][start.y].t=0;
 81     queue <int> Q;
 82     Q.push(start.x);
 83     Q.push(start.y);
 84     while(!Q.empty())
 85     {
 86         int x = Q.front();
 87         Q.pop();
 88         int y = Q.front();
 89         Q.pop();
 90 
 91         if(x < 1 || x > n || y < 1 || y > m || !G[x][y]) continue;
 92 
 93         for(int i=0;i<4;i++)
 94         {
 95             int xx = x + dir[i][0];
 96             int yy = y + dir[i][1];
 97 
 98             if(xx < 1 || xx > n || yy < 1 || yy > m || !G[xx][yy]) continue;
 99 
100             int temp = bfs(step[x][y].t,step[x][y].cnt,i);
101             if(temp < step[xx][yy].t)
102             {
103                 step[xx][yy].t = temp;
104                 step[xx][yy].cnt = i;
105                 Q.push(xx);
106                 Q.push(yy);
107                 //printf("x:%2d y:%2d cnt:%2d xx:%2d yy:%2d \n",x,y,i,xx,yy);
108                 //show();
109             }
110         }
111     }
112 }
113 int main()
114 {
115     int T;
116     scanf("%d",&T);
117     while(T--)
118     {
119         scanf("%d %d %d",&n,&m,&p);
120         memset(G,false,sizeof(G));
121         for(int i=1;i<=n;i++)
122             for(int j=1;j<=m;j++)
123             G[i][j]=read_ch(i,j);
124         _bfs();
125         printf(step[pos.x][pos.y].t != INF?"%d\n":"YouBadbad\n",step[pos.x][pos.y].t);
126     }
127     return 0;
128 }

 

转载于:https://www.cnblogs.com/By-ruoyu/p/4437587.html

内容概要:本文系统介绍了算术优化算法(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、付费专栏及课程。

余额充值