1908: 小火山的围棋梦想

本文介绍了使用广度优先搜索(BFS)与深度优先搜索(DFS)解决迷宫边界问题的具体实现过程。通过两个示例代码,展示了如何标记可达边界,并将内部可达区域转化为特定符号。适用于理解BFS和DFS的基本应用。

题目链接

天啊,这道题我调代码调了一天啊,代码能力太差,我也没有办法,,一天才调出来,心也赛赛的,天啊

BFS


#include<stdio.h>
#include<stack>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<string.h>
#define LL long long
const int N=100005;
using namespace std;
char  mapp[33][33];
int x[700],y[700];
int vis[33][33];
int dis[4][2]= {{1,0},{-1,0},{0,-1},{0,1}};
struct node
{
    int x1;
    int y1;
};
int n,m;
int flag=0;
void bfs(int a,int b)
{
    queue<node>q;
    node per,nexts;
    per.x1=a;
    per.y1=b;
    vis[a][b]=1;
    q.push(per);
    while(!q.empty())
    {
        per=q.front();
        q.pop();
        if(per.x1==0||per.x1==n-1||per.y1==0||per.y1==m-1)
        {
            return ;
        }
        for(int i=0; i<4; i++)
        {
            nexts.x1=per.x1+dis[i][0];
            nexts.y1=per.y1+dis[i][1];
            if(nexts.x1>=0&&nexts.x1<=n-1&&nexts.y1>=0&&nexts.y1<=m-1&&mapp[nexts.x1][nexts.y1]=='.'&&vis[nexts.x1][nexts.y1]==0)
            {
                vis[nexts.x1][nexts.y1]=1;
                q.push(nexts);
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(vis[i][j]==1)
            {
                mapp[i][j]='*';
            }
        }
    }
}
int main()
{
    int t;
    char s;
    scanf("%d",&t);
    int cnt=1;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int u=0;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                cin>>s;
                mapp[i][j]=s;
                if(mapp[i][j]=='.')
                {
                    x[u]=i;
                    y[u]=j;
                    u++;
                }
            }
        }
        for(int i=0; i<u; i++)
        {
            if(x[i]==0||x[i]==n-1||y[i]==0||y[i]==m-1)
                mapp[x[i]][y[i]]='.';
            else
            {
                memset(vis,0,sizeof(vis));
                bfs(x[i],y[i]);
            }
        }
        printf("Case %d:\n",cnt++);
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                if(j==m-1)
                    printf("%c\n",mapp[i][j]);
                else
                    printf("%c",mapp[i][j]);
            }
    }
    return 0;
}

DFS


#include <stdio.h>
#include <algorithm>
#include <string.h>
#define maxn 30
using namespace std;

int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
char maps[maxn][maxn];
int v[maxn][maxn];
int n, m;

void DFS(int x, int y)
{
    v[x][y] = 1;

    for(int i=0; i<4; i++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];

        if(nx>=0 && nx<n && ny>=0 && ny<m && maps[nx][ny]=='.' && !v[nx][ny])
             {
                 v[nx][ny]=1;
                 DFS(nx, ny);
             }
    }
}
int main()
{
    int T, cnt=1;

    scanf("%d", &T);

    while(T --)
    {
        scanf("%d %d", &n, &m);

        for(int i=0; i<n; i++)
            scanf("%s", maps[i]);

        memset(v, 0, sizeof(v));

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(i==0 || j==0 || i==n-1 || j==m-1) continue;

                if(maps[i][j]=='.' && !v[i][j])
                    DFS(i, j);
            }
        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(v[i][j] && maps[i][j]=='.')
                    maps[i][j]='*';
            }
        }

        printf("Case %d:\n", cnt++);

        for(int i=0; i<n; i++)
            printf("%s\n", maps[i]);

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值