前言
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入格式
第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,ji,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式
m行,对于每个询问输出相应答案。
输入
2 2
01
10
1 1
2 2
输出
4
4
说明/提示
所有格子互相可达。
对于20%的数据,n≤10;
对于40%的数据,n≤50;
对于50%的数据,m≤5;
对于60%的数据,n≤100,m≤100;
对于100%的数据,n≤1000,m≤100000。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class BFS_5 {
static int N = 1003,M = 100005;
static int n,m,color;
static char[][] mp = new char[N][N];
static int[][] vis = new int[N][N];
static String strings;
static int[] ans = new int[M];
static int[] xx = {0,0,-1,1};
static int[] yy = {-1,1,0,0};
static int[][] nodes = new int[M][2];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();m = scanner.nextInt();
//录入地图
for (int i = 1; i <= n; i++){
strings = scanner.next();
for (int j = 1; j <= strings.length(); j++) {
mp[i][j] = strings.charAt(j-1);
}
}
//录入起始点
int x,y;
for (int i = 1; i <= m ; i++) {
x = scanner.nextInt();
y = scanner.nextInt();
nodes[i][0] = x;
nodes[i][1] = y;
}
//对于还没有被扫描到的区域进行bfs搜索
for (int i = 1; i <= m; i++) {
if(vis[nodes[i][0]][nodes[i][1]]==0){
color++;
bfs(nodes[i]);
}
System.out.println(ans[vis[nodes[i][0]][nodes[i][1]]]);
}
}
public static void bfs(int[] node) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(node);
vis[node[0]][node[1]] = color;
ans[color]++;
while (!queue.isEmpty()){
int[] cur = queue.peek();
vis[cur[0]][cur[1]] = color;
for (int i = 0; i < 4; i++) {
int dx = cur[0] + xx[i];
int dy = cur[1] + yy[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=n&&vis[dx][dy]==0&&mp[cur[0]][cur[1]]!=mp[dx][dy]){
int[] temp = new int[]{dx,dy};
queue.offer(temp);
vis[temp[0]][temp[1]] = color;
ans[color]++;
}
}
queue.poll();
}
}
}