哈理工OJ 1942 this is bad problom(搜索BFS)

本文介绍了一种基于广度优先搜索(BFS)的迷宫寻路算法,用于在一个包含障碍物的N*N网格中寻找从起点到最近目标点的最短路径。该算法适用于解决类似于在城市中寻找最近目的地的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1942

this is bad problom
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 232(51 users) Total Accepted: 56(48 users) Rating: Special Judge: No
Description
周末了,小辉在大街上无聊地压马路,突然他想去找女童鞋一起快乐地玩耍,但是他有个毛病就是讨厌走路,他现在想知道到每个女童鞋那里的最少步数,再决定找哪个女童鞋。

首先给出小辉和女童鞋所在的N*N平面图,如图为6*6平面图。

….#.
.*.#..
……

#

……
……
有Q个女童鞋,每个女童鞋所在的地点用坐标表示,左上角处坐标为(0,0)。

图中’*’代表小辉所在的位置,即(1,1),’.’代表空地,’#’代表不能直接通过的建筑物。

小辉将去找他所能到达的并且离他步数最少的那个女童鞋。

女童鞋的位置可能在除建筑物的任意位置上。

Input
有多组测试数据,处理到文件结束。
对于每组测试数据,第一行是两个整数N(2<=N<=100),Q(1<=Q<=1000),分别代表地区的边长和女童鞋的个数.
接下来输入n*n平面图,代表地区平面图。
然后Q行,每行一个坐标代表女童鞋所在位置。

Output
输出小辉到那个女童鞋的步数,如果没有满足条件的女童鞋,则输出cry,最后换行.
Sample Input
6 3
….#.
.*.#..
……

#

……
……
0 0
1 4
5 3
3 2
*..

#


2 0
2 1
Sample Output
2
cry
Source
新生练习赛(2013.11.16)
Author
xuxu@hrbust

【思路分析】水搜索题目,直接把女生位置标记上,然后直接搜就行了。
【AC代码】

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

struct node
{
    int x,y,step;
};
char a[105][105],book[105][105];
int n,q;
int dir[4][2]={{0,1},{0,-1},{1.0},{-1,0}};
int bfs(int sx,int sy)
{
    memset(book,0,sizeof(book));
    queue<node>q;
    node fr,ne;
    fr.x=sx,fr.y=sy,fr.step=0;
    book[sx][sy]==1;
    q.push(fr);
    while(!q.empty())
    {
        fr=q.front();
        q.pop();
        if(a[fr.x][fr.y]=='X')
        {
            return fr.step;
        }
        for(int i=0;i<4;i++)
        {
            ne.x=fr.x+dir[i][0];
            ne.y=fr.y+dir[i][1];
            ne.step=fr.step+1;
            if(a[ne.x][ne.y]!='#'&&book[ne.x][ne.y]==0&&ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<n)
            {
                book[ne.x][ne.y]=1;
                q.push(ne);
            }
        }
    }
    return -1;
}

int main()
{
    while(~scanf("%d%d",&n,&q))
    {
        int sx,sy;
        for(int i=0;i<n;i++)
        {
            scanf("%s",&a[i]);
            for(int j=0;j<n;j++)
            {
                if(a[i][j]=='*')
                {
                    sx=i;
                    sy=j;
                }
            }
        }
        int u,v;
        for(int i=0;i<q;i++)
        {
            scanf("%d%d",&u,&v);
            a[u][v]='X';
        }
        int re=bfs(sx,sy);
        if(re==-1)
        {
            printf("cry\n");
        }
        else
        {
            printf("%d\n",re);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值