有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入描述:
输入包含多组数据。
每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:
- “.”:黑色的瓷砖;
- “#”:白色的瓷砖;
- “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
输出描述:
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
代码如下:
思路:记录开始的位置,设置一个队列,先让开始位置入队,当队列不为空,则出队首,并判断队首的上下左右四个位置是否满足条件,满足则依次入队,count++。
import java.util.Scanner;
import java.util.LinkedList;
import java.util.Queue;
public class Main{
static class Node{
int x;
int y;
public Node(int x,int y){
this.x = x;
this.y = y;
}
}
static int[][] direction = {{0,1},{0,-1},{1,0},{-1,0}};
static boolean[][] visited;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int m = sc.nextInt();
int n = sc.nextInt();
char[][] arr = new char[m][n];
visited = new boolean[m][n];
Node start = null;
for(int i=0;i<m;i++){
String str = sc.nextLine();
for(int j=0;j<n;j++){
arr[i][j]=str.charAt(j);
if(arr[i][j]=='@'){
start = new Node(i,j);
}
}
}
bfs(arr,start);
}
}
public static void bfs(char[][] arr,Node start){
Queue<Node> queue = new LinkedList<>();
queue.offer(start);
visited[start.x][start.y]=true;
int count = 1;
while(!queue.isEmpty()){
Node cur = queue.poll();
for(int i=0;i<4;i++){
Node next = new Node(start.x+direction[i][0],start.y+direction[i][1]);
if(next.x>=0&&next.x<arr.length&&next.y>=0&&next.y<arr[0].length&&arr[next.x][next.y]!='#'&&!visited[next.x][next.y]){
count++;
queue.offer(next);
visited[next.x][next.y] = true;
}
}
}
System.out.println(count);
}
}