广搜_模板题_01迷宫

题目描述

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

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

输入输出格式

输入格式:

第1行为两个正整数n,mn,m。

下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。

接下来m行,每行2个用空格分隔的正整数i,j对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

输出格式:

m行,对于每个询问输出相应答案。

输入输出样例

输入样例#1: 

2 2
01
10
1 1
2 2
输出样例#1: 
4
4

AC代码

#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
#define MAX 1005

using namespace std;

typedef struct
{
    int x;
    int y;
} Ele;

int n,m;
int sum;
string graph[MAX];
int flag[MAX][MAX];
//记录连通分量(用于优化)
Ele step[1000001];
int save[MAX][MAX];


int dirx[4] = {1,-1,0,0};
int diry[4] = {0,0,1,-1};

int bfs(int x,int y);

int main()
{
    int x,y;
    cin>>n>>m;
    for(int i = 0 ; i<n ; i++)
        cin>>graph[i];
    for(int i = 0 ; i<m ; i++)
    {
        sum = 1;
        cin>>x>>y;
        x--;
        y--;
        if(save[x][y]==0)
            cout<<bfs(x,y)<<endl;
        else
            cout<<save[x][y]<<endl;
    }
    return 0;
}

int bfs(int x,int y)
{
    queue<Ele> q;
    int t = 0;
    Ele node,temp,next;
    node.x = x;
    node.y = y;
//将起点入队
    q.push(node);
    step[t].x = x;
    step[t].y = y;
    flag[x][y] = 1;
//当队列不为空时
    while(!q.empty())
    {
//取出队头
        temp = q.front();
//队头出队
        q.pop();
//遍历出度
        for(int i = 0 ; i<4 ; i++)
        {
            next.x = temp.x+dirx[i];
            next.y = temp.y+diry[i];
//条件控制
            if(next.x<0||next.x>=n)
                continue;
            if(next.y<0||next.y>=n)
                continue;

            if(flag[next.x][next.y]==0
               &&abs(graph[next.x][next.y]-graph[temp.x][temp.y])==1)
            {
                t++;
                step[t].x = next.x;
                step[t].y = next.y;

                sum++;
                flag[next.x][next.y] = 1;
//满足条件入队
                q.push(next);
            }
        }
    }
    for(int i = 0 ; i<=t ; i++)
        save[step[i].x][step[i].y] = sum;

    return sum;
}

模板


void bfs(int x...)
{
    queue<T> q;
//起点入队
    q.push(x);
//标记访问
    flag[x] = 1;
//队列不为空时循环
    while(!q.empty())
    {
//获取队头
        int t = q.front();
//队头出队
        q.pop();
//遍历所有出度
        for()
        {
//条件控制
            if(flag[]==0&&)
            {
//标记访问
                flag[] = 1;
//满足条件入队
                q.push(t+k);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值