红与黑——BFS

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入描述:
输入包含多组数据。

每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:

  1. “.”:黑色的瓷砖;
  2. “#”:白色的瓷砖;
  3. “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

输出描述:
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
代码如下:
思路:记录开始的位置,设置一个队列,先让开始位置入队,当队列不为空,则出队首,并判断队首的上下左右四个位置是否满足条件,满足则依次入队,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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋丹尼尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值