4.dfs例题---踏青

连通图计数

题目:

代码:

import java.util.Scanner;

public class Main {
	/*
	 * 思路:
测试数据
2 4
##..
..##
	 * */
	static int n;//行
	static int m;//列
	static boolean[][] vis;//访问数组
	static int[][] t= {{1,0},{-1,0},{0,1},{0,-1}};
	public static void main(String[] args){
		//1.输出相关值
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//n行
		int m = sc.nextInt();//m列
		char[][] g = new char[n][];
		vis = new boolean[n][m];
		for(int i=0;i<n;i++) {
			g[i] = sc.next().toCharArray();
		}
		//2.遍历
		int cnt=0;
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(g[i][j]=='#') {
					dfs(i,j,g);
					cnt++;
				}
			}
		}
		//3.输出结果
		System.out.println(cnt);
	}
	private static void dfs(int x, int y,char[][] g) {
		g[x][y]='.';
		for(int i=0;i<4;i++) {
			int xx = x+t[i][0];
			int yy = y+t[i][1];
			//直接用n和m有问题。要用g.length 和 g[0].length
			if(xx>=0 && xx<g.length && yy>=0 && yy<g[0].length && g[xx][yy]=='#') {
				dfs(xx,yy,g);
			}
		}
	}
	
}
	

分析:
即寻找草丛的个数(寻找连通图个数)

代码:

 

### 计算10×10棋盘中连通棋子数量的算法 #### 使用深度优先搜索(DFS) 可以通过深度优先搜索(DFS)遍历整个棋盘,标记已经访问过的棋子,并统计连通区域的数量。这种方法简单直观,适合处理此类问题。 ```c #include <stdio.h> #include <stdbool.h> #define SIZE 10 // 定义棋盘大小为10x10 // 方向数组,用于表示上下左右四个方向 const int dx[] = {-1, 1, 0, 0}; const int dy[] = {0, 0, -1, 1}; // DFS 函数,用于标记当前连通区域中的所有棋子 void dfs(char board[SIZE][SIZE], bool visited[SIZE][SIZE], int x, int y) { visited[x][y] = true; // 标记当前位置已访问 // 遍历四个方向 for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; // 检查新位置是否合法且未访问过 if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE && !visited[nx][ny] && board[nx][ny] == '.') { dfs(board, visited, nx, ny); // 继续深搜 } } } int count_eagles(char board[SIZE][SIZE]) { bool visited[SIZE][SIZE] = {false}; // 初始化访问标志矩阵 int eagle_count = 0; // “鹰”的数量计数器 // 遍历整个棋盘 for (int i = 0; i < SIZE; ++i) { for (int j = 0; j < SIZE; ++j) { if (!visited[i][j] && board[i][j] == '.') { dfs(board, visited, i, j); // 发现新的“鹰” eagle_count++; // 增加计数 } } } return eagle_count; } int main() { char board[SIZE][SIZE]; // 定义10x10棋盘 printf("请输入10x10棋盘布局,每行包含10个字符(-.):\n"); // 输入棋盘布局 for (int i = 0; i < SIZE; ++i) { scanf("%s", board[i]); } // 调用函数计算“鹰”的数量 int result = count_eagles(board); printf("棋盘中共有 %d 个‘鹰’。\n", result); return 0; } ``` ---代码实现了基于深度优先搜索的方法来统计棋盘上由 `'.'` 表示的己方棋子所构成的连通区域数量[^2]^。通过定义方向数组 `dx` 和 `dy` 来控制移动的方向,确保只在上下左右四个方向进行探索。每次发现一个新的未访问的 `'.'` 棋子时,调用 `dfs` 方法将其所在的连通区域全部标记为已访问,并增加计数器。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值