1629 01迷宫

1629 01迷宫

 

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。那么对于给定的迷宫,询问从某一格开始能移动到多少格。

输入描述 Input Description

输入的第1行为两个正整数n,m。

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

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

输出描述 Output Description

输出包括m行,对于每个询问输出答案。

样例输入 Sample Input

2 2

01

10

1 1

2 2

样例输出 Sample Output

4

4

数据范围及提示 Data Size & Hint

【样例说明】

所有格子互相可达。

 

【数据规模】

对于20%的数据,n≤10; 

对于40%的数据,n≤50;

对于50%的数据,m≤5;

对于60%的数据,n≤100,m≤100;

对于100%的数据,n≤1000,m≤1000000。

分类标签 Tags 点此展开 

 
暂无标签
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
#define N 1001
int n,m,dx[]={1,0,0,-1},dy[]={0,1,-1,0};
struct node{
    int x,y;
}o,t;
queue<node> q;
char str[N];
int a[N][N],vis[N][N],mem[N][N];
inline void bfs(){
    for(int i=0;i<m;i++){
        cin>>o.x>>o.y;
        o.x--;o.y--;
        if(mem[o.x][o.y]){
            printf("%d\n",mem[o.x][o.y]);continue;
        }
        int cnt=0;
        q.push(o);
        while(!q.empty()){
            o=q.front();
            for(int j=0;j<4;j++){
                t.x=dx[j]+o.x;
                t.y=dy[j]+o.y;
                if(t.x<0||t.y<0||t.x>=n||t.y>=n);else
                if(vis[t.x][t.y]!=-1&&a[t.x][t.y]+a[o.x][o.y]==1){//关键在这里 
                    vis[t.x][t.y]=-1;
                    q.push(t);
                    cnt++;
                }
            }
            q.pop();
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(vis[i][j]==-1)
                    vis[i][j]=0,
                    mem[i][j]=cnt;    
        if(cnt==0) cnt++;
        printf("%d\n",cnt);
    }
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>str;
        for(int j=0;j<n;j++)
            a[i][j]=str[j]-'0';
    }
    bfs();
    return 0;
}

 

posted @ 2016-06-10 17:50  神犇(shenben)  阅读(164)  评论(0编辑  收藏  举报