547. Friend Circles (java)

博客介绍一道考察图遍历求连通分支数量的题目。采用深度搜索(dfs)方法,以行数代表人数数量,用boolean类型的visited数组记录访问情况。每次dfs访问一个分支,分支内无未访问点时count加1,直至访问完所有未访问点。
class Solution { 
        public static void dfs(int[][] M, int[] visited, int i) {
	        for (int j = 0; j < M.length; j++) {
	            if (M[i][j] == 1 && visited[j] == 0) {
	                visited[j] = 1;
	                dfs(M, visited, j);
	            }
	        }
	    }
	    public static int findCircleNum(int[][] M) { 
	        int[] visited = new int[M.length];
	        int count = 0;
	        for (int i = 0; i < M.length; i++) {
	            if (visited[i] == 0) {
	                dfs(M, visited, i);
	                count++;
	            }
	        }
	        return count;
	    }
    } 

这道题是考察图的遍历,看看有几个连通分支。

用的是深度搜索dfs,它的行数就是它的人数数量,用一个visited的boolean数组记录是否访问了,每次dfs都访问一个分支,当该分支内没有未访问的点时,count++;直到访问完所有的未访问点。

### 排查 Unity 中 `[Command]` 方法未在服务器端执行的原因 在 Unity 的网络环境中,标记为 `[Command]` 的方法需要满足特定条件才能在服务器端正确执行。以下是一些可能的原因及解决方案: #### 1. 确保对象具有权威性 `[Command]` 方法只能由具有权威性的客户端调用,并且会在服务器端执行。如果对象没有被标记为 `isServer` 或 `hasAuthority`,则 `[Command]` 方法不会触发[^1]。 ```csharp if (!isServer && !hasAuthority) { Debug.LogError("Object does not have authority or is not on the server."); } ``` #### 2. 检查网络连接状态 确保客户端和服务器之间的网络连接正常,并且客户端已经成功加入游戏房间。如果客户端未正确连接到服务器,则 `[Command]` 方法无法发送到服务器端[^2]。 ```csharp if (!NetworkClient.active) { Debug.LogError("Client is not connected to the server."); } ``` #### 3. 验证 `OnTriggerEnter2D` 是否触发 即使碰撞器正常工作,也需要确保 `OnTriggerEnter2D` 方法确实被调用。可以通过添加日志来验证这一点[^3]。 ```csharp void OnTriggerEnter2D(Collider2D collision) { if (collision.GetComponent<Weapon>() != null) { Debug.Log("OnTriggerEnter2D triggered with object: " + collision.name); CmdRemoveFromPool(); } } ``` #### 4. 确认 `[Command]` 方法的参数传递 如果 `[Command]` 方法包含参数,则必须确保这些参数能够正确序列化并传递给服务器。例如,如果参数是一个自定义类,则需要确保该类实现了 `INetworkSerializable` 接口[^4]。 ```csharp [Command] private void CmdRemoveFromPool(int objectId) { Debug.Log("CmdRemoveFromPool executed on server for object ID: " + objectId); RemoveObjectFromPool(objectId); } private void RemoveObjectFromPool(int objectId) { // 移除逻辑 } ``` #### 5. 检查服务器端的日志输出 为了验证 `[Command]` 方法是否在服务器端执行,可以在方法中添加日志输出,并确保服务器端启用了调试日志功能[^5]。 ```csharp [Command] private void CmdRemoveFromPool() { Debug.Log("CmdRemoveFromPool executed on server."); if (GameManager.instance.circles_0.Contains(gameObject)) { GameManager.instance.circles_0.Remove(gameObject); } else if (GameManager.instance.circles_1.Contains(gameObject)) { GameManager.instance.circles_1.Remove(gameObject); } GameManager.instance.pool.Release(gameObject); } ``` #### 6. 确保 `GameManager` 实例可用 如果 `GameManager` 实例在服务器端不可用或未正确初始化,则 `[Command]` 方法中的逻辑将无法正常执行。可以通过添加检查来避免潜在问题[^6]。 ```csharp if (GameManager.instance == null) { Debug.LogError("GameManager instance is null on the server."); return; } ``` #### 7. 使用 Network Profiler 工具 Unity 提供了 Network Profiler 工具,可以用来监控网络消息的发送和接收情况。通过此工具可以确认 `[Command]` 方法的消息是否已从客户端发送到服务器端[^7]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值