红黑瓷砖(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 ;
				}
			}
		}
	}
}
相关推荐
向阳2561 分钟前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
javaisC9 分钟前
c语言数据结构--------拓扑排序和逆拓扑排序(Kahn算法和DFS算法实现)
c语言·算法·深度优先
XiaoLeisj18 分钟前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南19 分钟前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong25 分钟前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式
ChinaRainbowSea34 分钟前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq
雾月5535 分钟前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
melck1 小时前
liunx日志查询常用命令总结
java·服务器·网络
守护者1701 小时前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习
程序员 小柴1 小时前
docker的与使用
java·docker·eureka