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

news/2024/11/25 15:40:10/

题目:

输入棋盘: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,白子2void 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;
}

http://www.ppmy.cn/news/353565.html

相关文章

围棋的意义

“举剑的意义&#xff0c;不是为了杀戮&#xff0c;而是为了守卫 。”----《无影剑》 之所以用这个标题&#xff0c;是昨天在弈城遇见一个高手&#xff0c;一个1D的高手&#xff0c;147胜&#xff0c;0负的1D高手。当他向我这个2D发出对局邀请时&#xff0c;我只犹豫了3秒钟&am…

关于电脑围棋

一直想编写个围棋对弈程序&#xff0c;中国象棋和国际象棋的对弈程序都已达到大师级的水平&#xff0c;但围棋程序目前最高水平只有几级&#xff0c;才入门&#xff0c;实在小儿科。事实上很多人工智能领域的顶尖学者在这方面的研究颇为深入&#xff0c;奈何没有起色。后来应昌…

比特币Ordinals上线递归铭文;坎昆升级纳入包括EIP-4844 等在内的5个EIP |Tokenview

一周速览 过去一周&#xff0c;明星项目动态如下&#xff1a; Bitcoin Ordinals上线递归铭文; Cancun 升级纳入的EIP包括EIP-1153、EIP-4788、EIP-4844 等 5 个&#xff1b; Horizen EON 将于6月13日进行Gobi 测试网升级&#xff1b; Ronin Network将于6 月13日进行网络升级 …

phpcms v9文件上传漏洞复现

1.压缩包文件无递归删除 $file $_FILES[file]; #检查文件是否为空文件 if (!$file) {exit("请勿上传空文件"); } $name $file[name]; $dir upload/; $ext strtolower(substr(strrchr($name, .), 1));function check_dir($dir) #检查文件格式 …

华为荣耀V9手机通过在Fastboot模式写ramdisk.img来获取ROOT权限 | 华为荣耀V9怎么获取ROOT权限 | 华为荣耀V9怎么用面具Magisk做ROOT权限

先把系统刷到8.0&#xff0c;然后参考华为荣耀9获取ROOT权限&#xff08;文章链接&#xff1a;https://coco56.blog.csdn.net/article/details/127073267&#xff09;&#xff0c;教程虽然是针对荣耀9的&#xff0c;但荣耀V9实际测试也没问题&#xff0c;应该所有海思麒麟960的…

帆软 V9 Getshell 漏洞

0x00 任意文件上传漏洞【FineReport V9】 0x01 漏洞描述 此漏洞是任意文件覆盖&#xff0c;上传 JSP 马&#xff0c;需要找已存在的 JSP 文件进行覆盖&#xff0c;寻找Tomcat 启动帆软后默认存在的 JSP 文件 0x02 漏洞详情 POST /WebReport/ReportServer?opsvginit&cmd…

JLink v9 固件修复

文件下载地址&#xff08;引用wyd的文件&#xff09;&#xff1a; https://gitee.com/wyd66666666/jlinkv9-repair接线 需要将坏的JLink拆开&#xff0c;用线将好的JLink和坏的JLink连起来 VTref -- VTref SWDIO -- TMS SWCLK -- TCK GND -- GND烧录方法 (1) 烧录一个…

工具 JLINK V9 自制

自制JLINK V9 测试可以使用 只是不能更新 感谢网友的分享~&#xff01;具体的网址没有保存。在此基础上才能弄出自制的JLINKV9 原理图&#xff0c;PCB效果、材料清单如下&#xff1a;