简化的围棋棋子规则(C++实现)

2023-05-16

题目:

输入棋盘:1 1 2 3 2 3
                  3 3 2 3 3 3
                  2 2 2 3 3 3
                  1 2 2 2 3 3
                  2 1 1 2 3 1     (其中1代表空,2代表白子,3代表黑子)
输出:白棋活子个数,黑棋活子个数

来源:华为校招实习生笔试题第二题

                 

#include <iostream>
#include <string>
#include <vector>
#include <array>
using namespace std;

class Solution{
public:
	int breathe; // 气
	int count; //
	int result[2]; // 结果,活子个数,0白子,1黑子
	
	// 函数四:查看棋盘
	void watch(vector<vector<int>> &arr){
		for (int i = 0; i < arr.size(); i++){
			for (int j = 0; j < arr[i].size(); j++){
				cout << arr[i][j] << "  ";
			}
			cout << endl;
		}
	}

	// 函数三:找到arr里面的值为a的数替换为b,并return a的数目
	int change(vector<vector<int>> &arr, int a, int b){
		int changeNum = 0;
		for (int i = 0; i < arr.size(); i++){
			for (int j = 0; j < arr[i].size(); j++){
				if (arr[i][j] == a) {
					arr[i][j] = b;
					changeNum++;
				}
			}
		}
		return changeNum;
	}

	// 函数一:遍历所有棋子
	void solve(vector<vector<int>> &arr){
		breathe = 0;
		count = 0;
		result[0] = 0;  // 活白子结果
		result[1] = 0;

		for (int i = 0; i < arr.size(); i++){
			for (int j = 0; j < arr[i].size(); j++){
				// 遍历到已经处理过的子和空。矩阵0代表遍历过,1代表为无子
				if (arr[i][j] == 0 || arr[i][j] == 1) continue;
				// 遍历到白子,找到所有与之相连的子、气
				if (arr[i][j] == 2){
					deepFirst(arr, 2, i, j);
					watch(arr);
					breathe = change(arr, -1, 1); // 回溯
					if (breathe >= 2){
						result[0] += count;
					}
					breathe = 0;    // 回溯
					count = 0;
				}

				// 遍历到黑子,找到所有与之相连的子、气
				if (arr[i][j] == 3){
					deepFirst(arr, 3, i, j);
					watch(arr);
					breathe = change(arr, -1, 1); // 回溯
					if (breathe >= 2){
						result[1] += count;
					}
					breathe = 0;    // 回溯
					count = 0;
				}
			}
		}
	}


	// 函数二:①找气   ②找相连的相同子,处理过的子置为0
	// 子状态,空为1,数过的空为-1,处理过黑白子置为0,黑子3,白子2
	void deepFirst(vector<vector<int>> &arr, int type, int i, int j){

		// 该子越界
		if (i < 0 || i >= arr.size() || j < 0 || j >= arr[0].size())  return;   
		// 该子为1,空
		if (arr[i][j] == 1){   
			arr[i][j] = -1;
			return;
		}// 该子不匹配
		else if (arr[i][j] != type)  {
			return;
		}
		// 该子为相连的子
		count++;
		arr[i][j] = 0;

		// 递归
		deepFirst(arr, type, i + 1, j);
		deepFirst(arr, type, i - 1, j);
		deepFirst(arr, type, i, j+1);
		deepFirst(arr, type, i, j-1);
	}
};



int main(){
	int N = 5;
	vector<vector<int>> arr = {
			{ 1, 1, 2, 3, 2, 3 },
			{ 3, 3, 2, 3, 3, 3 },
			{ 2, 2, 2, 3, 3, 3 },
			{ 1, 2, 2, 2, 3, 3 },
			{ 2, 1, 1, 2, 3, 1 }
	};

	Solution solution;
	solution.solve(arr);
	cout << solution.result[0] << "  " << solution.result[1];

	while (1);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简化的围棋棋子规则(C++实现) 的相关文章

随机推荐

  • Linux/Centos Makefile 使用总结

    1 Makefile 简介 Makefile 是和 make 命令一起配合使用的 很多大型项目的编译都是通过 Makefile 来组织的 如果没有 Makefile 那很多项目中各种库和代码之间的依赖关系不知会多复杂 Makefile的组织
  • 深入理解SQLite3之sqlite3_exec及回调函数

    sqlite3的C C 43 43 接口API主要有3个重要函数 xff0c 分别为 1 sqlite3 open const char filename sqlite3 ppDb 2 int sqlite3 exec sqlite3 An
  • 5G:三大场景--- eMBB、URLLC、mMTC

    背景 xff1a 很多人认为 5G 确实是未来的发展方向 xff0c 但具体到哪些落地 xff0c 又说不清楚 xff0c 甚至于认为 5G 只比 4G 多了一个G 而已 xff0c 但笔者认为 xff1a 5G 在移动通信领域绝对是革命性
  • Linux:lspci命令介绍

    lspci xff0c 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具 pci是一种总线 xff0c 而通过pci总线连接的设备就是pci设备了 如今 xff0c 我们常用的设备很多都是采用pci总线了 xff0c
  • iperf详细使用方法

    Iperf 是一个网络性能测试工具 Iperf可以测试TCP和UDP带宽质量 Iperf可以测量最大TCP带宽 xff0c 具有多种参数和UDP特性 Iperf可以报告带宽 xff0c 延迟抖动和数据包丢失 Iperf使用方法与参数说明 参
  • IPSec浅见

    1 IPSEC协议簇安全框架 a IPSec简介 IPSec xff08 Internet Protocol Security xff09 xff1a 是一组基于网络层的 xff0c 应用密码学的安全通信协议族 IPSec不是具体指哪个协议
  • IPsec:strongswan与vpp实现ipsec

    1 strongswan 43 vpp简介 strongswan与vpp如何结合 本次实验使用的是VPP 20 01 版本 43 strongswan 5 9 6版本 目前strongSwan 43 vpp的方案主要是使用strongswa
  • Linux:启动sshd服务的时候提示错误Unsupported option UsePAM

    问题 分析 默认的configure 没有启用 with pam选项 xff0c 如果在sshd config配置文件里加入UsePAM no 就会导致上面的错误提示 UsePAM与ssh密码认证相关 xff0c 但公司服务器禁止通过密码认
  • Ubuntu: ssh升级后服务不稳定不断重启,查看sshd服务状态为activating(start)的解决办法

    现象 xff1a Ubuntu20 04 升级ssh7 4到8 1版本后 xff0c ssh连接不稳定 xff0c 时断时续 xff0c systemctl status sshd查看服务状态为activating start xff0c
  • Linux:grep命令检索文件内容详解

    前言 Linux系统中搜索 查找文件中的内容 xff0c 一般最常用的是grep命令 xff0c 另外还有egrep命令 xff0c 同时vi命令也支持文件内容检索 下面来一起看看Linux利用grep命令检索文件内容的详细介绍 方法如下
  • stm32零基础应该怎么入门?

    单片机 xff08 microcontrollers xff09 是一种集成电路芯片 xff0c 是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU 多种I O口和中断系统 定时器 计数器等功能集成到一块硅片上构成的一个小而完善
  • Linux:CPU频率调节模式以及降频方法简介

    概述 cpufreq的核心功能 xff0c 是通过调整CPU的电压和频率 xff0c 来兼顾系统的性能和功耗 在不需要高性能时 xff0c 降低电压和频率 xff0c 以降低功耗 xff1b 在需要高性能时 xff0c 提高电压和频率 xf
  • Linux:rsyslog 日志丢失 messages lost due to rate-limiting

    系统日志显示 cat var log messages Apr 7 16 20 01 ngnodeb rsyslogd imjournal 154664 messages lost due to rate limiting 解决方法 修改配
  • Linux:shell 中的单行注释和多行注释

    关于 shell 中的单行注释和多行注释 单行注释 众所周知 xff0c 使用 比如想要注释 echo 34 Hello World 34 root 64 test vim test sh echo 34 Hello World 34 多行
  • Shell三剑客之sed:修改 xml

    修改前 vim config xml lt config input type verify 61 34 bool 34 name 61 34 flow bypass class 34 visible 61 34 true 34 gt fa
  • STM32串口通信

    STM32串口通信 一 基于寄存器与基于固件库编写的差异二 stm32串口通信实战1 烧录方式2 代码及效果图 三 C语言程序里全局变量 局部变量 堆 栈等概念四 stm32的堆 栈 全局变量的分配地址 一 基于寄存器与基于固件库编写的差异
  • keil下的FreeRtos多任务程序

    keil下的Freertos多任务程序 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 2 直接使用野火的模板 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 用该链接下载Fr
  • 随笔小记(二十七)

    神经网络中Epoch Iteration Batchsize相关理解和说明 batchsize xff1a 中文翻译为批大小 xff08 批尺寸 xff09 简单点说 xff0c 批量大小将决定我们一次训练的样本数目 batch size将
  • 手把手教物体检测——EfficientDet

    目录 摘要 训练数据 1 下载Pytoch版的EfficientDet 2 制作数据集 3 下载EfficientNets预训练模型 4 安装模型需要的包 5 放置数据集 6 修改train py中的参数 测试 注意 摘要 谷歌大脑团队 Q
  • 简化的围棋棋子规则(C++实现)

    题目 xff1a 输入棋盘 xff1a 1 1 2 3 2 3 3 3 2 3 3 3 2 2 2 3 3 3 1 2 2 2 3 3 2 1 1 2 3 1 其中1代表空 xff0c 2代表白子 xff0c 3代表黑子 xff09 输出