【BFS】HRBUST 1942 this is bad problom

this is bad problom
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 280(64 users)Total Accepted: 72(62 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


基础bfs,有两个坑点:

1、女孩可能卡在墙里面。

2、女孩可能就在小辉身上。

思路:直接在地图上标记女孩的位置然后bfs就好。

附上AC代码

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

int n;
char Map[106][106];
int vis[106][106];

typedef struct{
    int x,y,n;
}poi;

int f[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};


void bfs(int x,int y)
{
    memset(vis,0,sizeof(vis));
    poi start;
    start.x = x;
    start.y = y;
    start.n = 0;
    vis[x][y]=1;
    queue<poi> p;
    p.push(start);
    while(!p.empty()){
        poi temp = p.front();
        p.pop();
        for(int i = 0 ; i < 4 ; i++){
            poi next;
            next.x = temp.x+f[i][0];
            next.y = temp.y+f[i][1];
            next.n = temp.n+1;
            if(Map[next.x][next.y]=='&'){
                printf("%d\n",next.n);
                goto mark;
            }
            else if(Map[next.x][next.y]!='#'&&next.x<n&&next.y<n&&next.x>=0&&next.y>=0&&vis[next.x][next.y]==0){
                vis[next.x][next.y]=1;
                p.push(next);
            }
        }
    }
    printf("cry\n");
    mark:;
}

void solve(void)
{
    int q;
    while(~scanf("%d%d",&n,&q)){
        for(int i = 0 ; i < n ; i++) scanf("%s",Map[i]);
        for(int i =0 ; i < q ; i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(Map[x][y]=='*'){
                printf("0\n");
                goto mark1;
            }
            Map[x][y] = '&';
        }

        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                if(Map[i][j]=='*') bfs(i,j);
            }
        }
        mark1:;
    }
}

int main(void)
{
    solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两米长弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值