红黑瓷砖(BFS和DFS)

复制代码
9 6
....#.
.....#
......
......
......
......
......
#@...#
.#..#.

45

BFS

java 复制代码
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
	//. 黑色
	//# 红色
	//@ 黑色开始
	static final int N = 11;
	static int n,m,ans = 1;	
	static char[][] g = new char[N][N];
	static boolean[][] vis = new boolean[N][N];
	
	public static void bfs(int[] start) {
		Deque<int[]> dq = new LinkedList<>();
		dq.addLast(start);
		vis[start[0]][start[1]] = true;//@记录一次 ans初始值为1

		int[] dx = new int[] {1,-1,0,0};
		int[] dy = new int[] {0,0,1,-1};
		
		while(!dq.isEmpty()) {
			int[] t = dq.pollFirst();
			for(int i=0;i<4;i++) {
				int x = t[0]+dx[i];
				int y = t[1]+dy[i];
				if(x<0||x>n-1||y<0||y>m-1)
					continue;
				if(g[x][y] == '#')
					continue;
				if(vis[x][y])//如果访问过则continue
					continue;
				else {//没有访问过要标记为访问过之后 ans++ 然后入队列
					vis[x][y] = true;
					ans++;
					dq.addLast(new int[] {x,y});					
				}
			}
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		sc.nextLine();
		
		g = new char[n][m];
		for(int i=0;i<n;i++)
			g[i] = sc.nextLine().toCharArray();
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(g[i][j] == '@') {
					bfs(new int[] {i,j});
					System.out.println(ans);
					return ;
				}
			}
		}
	}
}

DFS

java 复制代码
import java.util.Scanner;
public class Main {
	//. 黑色
	//# 红色
	//@ 黑色开始
	static final int N = 11;
	static int n,m,ans = 1;	
	static char[][] g = new char[N][N];
	static boolean[][] vis = new boolean[N][N];
	static int[] dx = new int[] {1,-1,0,0};
	static int[] dy = new int[] {0,0,1,-1};
	
	public static void dfs(int x1,int y1) {	
			for(int i=0;i<4;i++) {
				int x2 = x1+dx[i];
				int y2 = y1+dy[i];
				if(x2<0||x2>n-1||y2<0||y2>m-1)
					continue;
				if(g[x2][y2] == '#')
					continue;
				if(vis[x2][y2])
					continue;
				else {
					vis[x2][y2] = true;
					ans++;
					dfs(x2,y2);
				}
			}
		}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		sc.nextLine();
		
		g = new char[n][m];
		for(int i=0;i<n;i++)
			g[i] = sc.nextLine().toCharArray();
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(g[i][j] == '@') {
					vis[i][j] = true;//@标记一次 ans初始为1
					dfs(i,j);
					System.out.println(ans);
					return ;
				}
			}
		}
	}
}
相关推荐
麻瓜code几秒前
【JUC】AQS enq() 自旋入队
java
Wang's Blog20 分钟前
Java框架快速入门: Spring Security+OAuth2之核心角色与授权流程
java·spring·github
hai_android30 分钟前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
caoerzhong39 分钟前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
君顾141 分钟前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
用户0942485680341 分钟前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring
caoerzhong1 小时前
JeeWMS 开源仓库管理系统多租户架构解析:一套 Java WMS 如何同时服务多个货主与多个仓库
java·架构·开源·vue
sunshine22 girl1 小时前
Java学习四 面向对象原理
java
干到60岁退休的码农1 小时前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis