算法培训 Day4-2 DFS BFS

算法培训 Day4-2 DFS BFS

1.迷宫

枚举四个方向 设置两个数组

int xi[4]={1,0,-1,0};
int yi[4]={0,1,0,-1};

比较坑的就是 只关注DFS函数 忘记将起点标记为已经访问 导致70分

自己都自闭了 不过还是在进步吧

#include<bits/stdc++.h>
using namespace std;
const int maxn=6,maxm=6;
int n,m;
int vis[maxn][maxm];
int Map[maxn][maxm];
int xi[4]={1,0,-1,0};
int yi[4]={0,1,0,-1};
int ans=0;
int sx,sy,fx,fy;
void DFS(int x,int y)
{
    if(x==fx && y==fy)
    {
        ans++;
        return ;
    }
    for(int i=0;i<4;i++)
    {
        int dx = x+xi[i];
        int dy = y+yi[i];
        if(dx>=1 && dx<=n && dy>=1 && dy<=m && !vis[dx][dy])
        //if(Map[dx][dy]==1 && !vis[dx][dy])
        {
            vis[dx][dy] = 1;
            DFS(dx,dy);
            vis[dx][dy] = 0;
        }
    }
}

int main()
{
    int t;
    scanf("%d%d%d",&n,&m,&t);

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            Map[i][j]=1;
    scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
    vis[sx][sy]=1;
    //没有标记起点  导致70分

    int x,y;
    for(int i=1;i<=t;i++){
        scanf("%d%d",&x,&y);
        vis[x][y]=1;
    }


    DFS(sx,sy);
    printf("%d",ans);
    return 0;

}

2.填涂颜色

将方阵中由 1 围成的闭合圈 内的数字 0 改为 2

于是选择对外围一圈的位置进行 BFS 搜索其四个方向,将数字是0的位置标记,最后剩下的就是闭合圈内的

一个小错误也是检查了很久 最后终于找出是循环条件写错了

感觉就是动手能力还要提高 要提高编程能力

#include<bits/stdc++.h>
using namespace std;
#define maxn 35
int Map[maxn][maxn];
int n;
int vis[maxn][maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};

struct node{
    int x,y;
};
void BFS(int x,int y)
{
    queue<node> Q;
    if(Map[x][y]==1)
        return ;

    Q.push(node{x,y});
    vis[x][y]=1;
    while(!Q.empty())
    {
        node P = Q.front();
        Q.pop();
        for(int i=0;i<4;i++)
        {
            int xi,yi;
            xi = P.x+dx[i];
            yi = P.y+dy[i];
            if(xi>=1 && xi<=n && yi>=1 && yi<=n && !vis[xi][yi] && Map[xi][yi]==0)
            {
                vis[xi][yi]=1;
                Q.push(node{xi,yi});
            }
        }

    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&Map[i][j]);

    for(int i=1;i<=n;i++){
        BFS(1,i);
    }

    for(int i=1;i<=n;i++){
        BFS(n,i);
     }
    for(int j=1;j<=n;j++){
        BFS(j,1);
    }

    //for(int j=n;j<=n;j++){
    //手残了   导致一直没找出来
    for(int j=1;j<=n;j++){
        BFS(j,n);
    }


    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
        {
            if(Map[i][j]==0 && vis[i][j]==0)
                printf("2 ");
            else
                printf("%d ",Map[i][j]);
        }

        printf("\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值