BFS/DFS

迷宫寻路算法

 #include<cstdio>  

 #include<cstring>  

#include<cstdlib>  

 using namespace std;  

const int maxn=100;  

 bool biaoji[maxn][maxn]; // 访问标记  

int map[maxn][maxn]; // 坐标范围  

 int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量,(x,y)周围的四个方向  

   

bool CheckEdge(int x,int y) // 边界条件和约束条件的判断  

 {  

     if(!biaoji[x][y] && ...) // 满足条件  

        return 1;  

     else // 与约束条件冲突  

         return 0;  

 }  

  

 void dfs(int x,int y)  

 {  

     biaoji[x][y]=1; // 标记该节点被访问过  

     if(map[x][y]==G) // 出现目标态G  

         {  

         ...... // 做相应处理  

         return;  

         }  

     for(int i=0;i<4;i++)  

     {  

        if(CheckEdge(x+dir[i][0],y+dir[i][1])) // 按照规则生成下一个节点  

             dfs(x+dir[i][0],y+dir[i][1]);  

     }  

     return// 没有下层搜索节点,回溯  

 }  

 int main()  

 {  

 return 0;  


例如杭电1242:

题目大意是,从起点走到目标点去,并且花的时间最少   

#include<cstdio>

#include<cstring>

#include<iostream>

 

using namespace std;

#define max 205

 

char map[max][max];

long a[100000],step,sum,n,m,visited[max][max];

long directions[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

 

void DFS(int x,int y)

{

    if(map[x][y] == 'r') a[sum++] = step;

    else if(map[x][y] != '#')

    {

          for(int i = 0; i < 4; i++)

          {

                int tx, ty;

                tx = x + directions[i][0];

                ty = y + directions[i][1];

                if( map[tx][ty] != '#' && tx>=1 && tx <= n && ty >= 1 && ty <= m && visited[tx][ty] == 0)

                {

                      if(map[tx][ty] == 'x')

                      {

                            step ++;

                      }

                      step++;

                      visited[tx][ty] = 1;

                      DFS(tx, ty);

                      visited[tx][ty] = 0;

                      step--;

                      if(map[tx][ty] == 'x')

                        step--;

                }

          }

    }

}

 

int main()

{

    long i,j,x,y,min;

    while(scanf("%ld%ld",&n,&m)>0)

    {

        memset(visited,0,sizeof(visited));

        sum=0;

        step=0;

        min=max;

 

        for(i=1;i<=n;i++)

        {

            getchar();

            for(j=1;j<=m;j++)

            {

                scanf("%c",&map[i][j]);

                if(map[i][j]=='a')

                {

                    x=i;

                    y=j;

                }

            }

        }

        visited[x][y]=1;

        DFS(x,y);

        if(sum==0)

            printf("Poor ANGEL has to stay in the prison all his life.\n");

        else

        {

            for(i=0;i<sum;i++)

                if(a[i]<min)

                    min=a[i];

            printf("%ld\n",min);

        }

    }

    return 0;

}



  广度优先搜索 

 * @param Vs 起点 

  * @param Vd 终点 

  */  

 bool BFS(Node& Vs, Node& Vd){  

     queue<Node> Q;  

    Node Vn, Vw;  

    int i;  

   

     //初始状态将起点放进队列Q  

     Q.push(Vs);  

     hash(Vw) = true;//设置节点已经访问过了!  

   

     while (!Q.empty()){//队列不为空,继续搜索!  

        //取出队列的头Vn  

         Vn = Q.front();  

   

         //从队列中移除  

         Q.pop();  

   

        while(Vw = Vn通过某规则能够到达的节点){  

             if (Vw == Vd){//找到终点了!  

                 //把路径记录,这里没给出解法  

                 return true;//返回  

             }  

   

             if (isValid(Vw) && !visit[Vw]){  

                 //Vw是一个合法的节点并且为白色节点  

                 Q.push(Vw);//加入队列Q  

                 hash(Vw) = true;//设置节点颜色  

             }  

         }  

     }  

     return false;//无解  

}


例如杭电1242:

题目大意是,从起点走到目标点去,并且花的时间最少

 #include <cstdio>

#include <cstring>

#include <cmath>

#include <set>  

#include <map>

#include <queue>

#include <string>

#include <iostream>

#include <algorithm>

#define INF 100000

using namespace std;

int sx, sy, ex, ey, n, m;

char mp[1000][1000];

int visit[1000][1000];   //用来标记是否走过(0为没有走过     1为走过了)

int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };

struct node    //结构体

{

int x, y;

int step;

};

int f(int x, int y)   //判断是否能走

{

if (x >= 0 && x < n && y >= 0 && y < m && mp[x][y] != '#' && visit[x][y] == 0) return 1;

return 0;

}

int bfs()

{

memset(visit, 0, sizeof(visit));   //全部的点都设为未标记

queue<node> que;

node frist, second;    //frist用来表示当前位置的点,  second用来表示下一位置的点

frist.x = sx, frist.y = sy, frist.step = 0;   //初始化,起点位置,步数设为0

visit[sx][sy] = 1;       //把该点标记

que.push(frist);        //把第一个点压入

while (!que.empty())

{

frist = que.front(); que.pop();

int x = frist.x, y = frist.y;

if (x == ex && y == ey) return frist.step;   //到达目标位置时结束

for (int i = 0; i < 4; i++)

{

int xx = x + dx[i], yy = y + dy[i];

if (f(xx, yy))

{

second.x = xx, second.y = yy;

second.step = frist.step + 1;

if (mp[xx][yy] == 'x') second.step++;  //题目要求特殊处理

que.push(second);

visit[xx][yy] = 1;

}

}

}

return -1;

}

int main()

{

while (scanf("%d%d", &n, &m) != EOF)

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

cin >> mp[i][j];

if (mp[i][j] == 'r') { sx = i; sy = j; }

if (mp[i][j] == 'a') { ex = i; ey = j; }

}

}

int ans = bfs();

if (ans == -1) printf("Poor ANGEL has to stay in the prison all his life.\n");

else printf("%d\n", ans);

}

return 0;

}

 

杭电2612  题目大意:两个人要到一个东西(这个东西可能有多个)的最短距离。

 

#include <cstdio>

#include <cstring>

#include <cmath>

#include <set>  

#include <map>

#include <queue>

#include <string>

#include <iostream>

#include <algorithm>

#define INF 100000

using namespace std;

int sx, sy, ex, ey, n, m;

char mp[1000][1000];

int visit[1000][1000];   //用来标记是否走过(0为没有走过     1为走过了)

int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };

int a[2][205][205];    //用来表示从起点到任一点的距离

int yx, yy, mx, my;

struct node    //结构体

{

int x, y;

int step;

};

int f(int x, int y)   //判断是否能走

{

if (x >= 0 && x < n && y >= 0 && y < m && mp[x][y] != '#' && visit[x][y] == 0) return 1;

return 0;

}

void bfs(int sx, int sy, int k)

{

memset(visit, 0, sizeof(visit));   //全部的点都设为未标记

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

a[k][i][j] = INF;

}

}

queue<node> que;

node frist, second;    //frist用来表示当前位置的点,  second用来表示下一位置的点

frist.x = sx, frist.y = sy, frist.step = 0;   //初始化,起点位置,步数设为0

a[k][sx][sy] = 0;   //用来表示从起点到任一点的距离

visit[sx][sy] = 1;       //把该点标记

que.push(frist);        //把第一个点压入

while (!que.empty())

{

frist = que.front();

que.pop();

int x = frist.x, y = frist.y;  //x、y分别是当前位置的横纵坐标

for (int i = 0; i < 4; i++)

{

int xx = x + dx[i], yy = y + dy[i];

if (f(xx, yy))

{

second.x = xx, second.y = yy;

a[k][xx][yy] = a[k][x][y] + 1;

visit[xx][yy] = 1;

que.push(second);

}

}

}

}

int main()

{

while (scanf("%d%d", &n, &m) != EOF)

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

cin >> mp[i][j];

if (mp[i][j] == 'Y') { yx = i; yy = j; }

if (mp[i][j] == 'M') { mx = i; my = j; }

}

}

bfs(yx, yy, 0);

bfs(mx, my, 1);

int minn = INF;

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

if (mp[i][j] == '@')

{

minn = min(minn, a[0][i][j] + a[1][i][j]);

}

}

}

minn = minn * 11;

cout << minn << endl;

}

return 0;

}



基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算法(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算法与传统聚类方法的技术路径。通过使用粒子群算法优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算法易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算法,并应用于居民用电数据的行为模式识别与分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算法、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算法的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算法与机器学习结合应用的教学与科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值