广度优先搜索——01迷宫

洛谷 P1141 01迷宫
题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

分析
广搜加并查集,洪水填充某格能走的地方并将他们标记上数量,下一次判断若坐标处有数量直接输出可避免超时
(从1-14做到2-12终于做出来了!!!!)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1001][1001],b[1001][1001];
int s[1000001][2];
int dx[5];
int dy[5];
int n,m;
void init()
{
    int i,j;
    string k;
    cin>>n>>m;
    for (i=1;i<=n;i++)
     {
         cin>>k;
         for (j=0;j<=n;j++)
          a[i][j+1]=k[j]-48;
     }
    dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0;
    dy[1]=0;dy[2]=0;dy[3]=1;dy[4]=-1;
    return;
}
void bfs(int x,int y)
{
    int h,t,i,j;
    t=1;h=0;s[1][0]=x;s[1][1]=y;b[x][y]=-1;
    do
    {
        h++;
        for (i=1;i<=4;i++) 
         if (s[h][0]+dx[i]>=1&&s[h][0]+dx[i]<=n&&s[h][1]+dy[i]>=1&&s[h][1]+dy[i]<=n)
          if (a[s[h][0]+dx[i]][s[h][1]+dy[i]]!=a[s[h][0]][s[h][1]]&&b[s[h][0]+dx[i]][s[h][1]+dy[i]]==0)
           {
                   t++;
                   s[t][0]=s[h][0]+dx[i];
                   s[t][1]=s[h][1]+dy[i];
                   b[s[t][0]][s[t][1]]=-1;
           }
    }
    while (h<=t);
    for (i=0;i<=h-1;i++) b[s[i][0]][s[i][1]]=h-1;
    return;
}
void doit()
{
    int i,x,y;
    for (i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        if (b[x][y]==0) bfs(x,y);
        printf("%d\n",b[x][y]);
    }
    return;
}
int main()
{
    init();
    doit();
    return(0);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值