【华为笔试】【模拟】【Java】竖直四子棋
■ 题目描述
竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。
一方的4个棋子横、竖或者斜方向连成一线时获胜。
现给定一个棋盘和红蓝对弈双方的下子步骤,判断红方或蓝方是否在某一步获胜。
下面以一个6×5的棋盘图示说明落子过程:
下面给出横、竖和斜方向四子连线的图示:
输入描述
输入为2行,第一行指定棋盘的宽和高,为空格分隔的两个数字;
第二行依次间隔指定红蓝双方的落子步骤,第1步为红方的落子,第2步为蓝方的落子,第3步为红方的落子,以此类推。
步骤由空格分隔的一组数字表示,每个数字为落子的列的编号(最左边的列编号为1,往右递增)。用例保证数字均为32位有符号数。
输出描述
如果落子过程中红方获胜,输出 N,red ;
如果落子过程中蓝方获胜,输出 N,blue ;
如果出现非法的落子步骤,输出 N,error。
N为落子步骤的序号,从1开始。如果双方都没有获胜,输出 0,draw 。
非法落子步骤有两种,一是列的编号超过棋盘范围,二是在一个已经落满子的列上落子。
N和单词red、blue、draw、error之间是英文逗号连接。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 5
1 1 2 2 3 3 4 4
输出
7,red
说明
在第7步,红方在第4列落下一子后,红方的四个子在第一行连成一线,故红方获胜,输出 7,red。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 5
0 1 2 2 3 3 4 4
输出
1,error
说明
第1步的列序号为0,超出有效列编号的范围,故输出 1,error。
public class VerticalChess {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] nums = sc.nextLine().split(" ");int rowLen = Integer.parseInt(nums[0]);int colLen = Integer.parseInt(nums[1]);String[] str = sc.nextLine().split(" ");int[][] grids = new int[rowLen][colLen];boolean isOver = false;for (int i = 0; i < str.length; i++) {int index = -1;int color = 1;int num = Integer.parseInt(str[i]);// 判断是否合法: 落子点在棋盘范围之外或者落子点已经有棋if (num <= 0 || num > colLen || grids[0][num - 1] != 0) {isOver = true;System.out.println(i + 1 + ",error");break;}// 判断落子的是哪个颜色,1默认表示为red,2为blueif (i % 2 != 0) {color = 2;}// 落子到对应的位置for (int j = rowLen - 1; j >= 0; j--) {if (grids[j][num - 1] == 0) {index = j; // 此时棋子横坐标为j,纵坐标为num-1grids[j][num - 1] = color;break;}}// 判断index是否合法if (index == -1) {System.out.println(i + 1 + ",error");isOver = true;break;}// 判断棋子是否超过6,并且判断是否能连接4个棋子if (i >= 6 && isSuccess(grids, index, num - 1)) {if (color == 1) {System.out.println(i + 1 + ",red");isOver = true;break;} else {System.out.println(i + 1 + ",blue");isOver = true;break;}}}// 判断是否已满if (!isOver) {System.out.println("0,draw");}}private static boolean isSuccess(int[][] grids, int row, int col) {int m = grids.length;int n = grids[0].length;int count = 0;int statist = 3; //统计棋子相连数量// 横向右相连if (col < n - 3) {int r = row;int c = col;while (statist != 0 && grids[r][++c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}// 横向左相连if (col>=3){int r = row;int c = col;while (statist != 0 && grids[r][--c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}// 纵向向下相连if (row<m-3){int r = row;int c = col;while (statist != 0 && grids[++r][c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}// 纵向向上相连if (row>=3){int r = row;int c = col;while (statist != 0 && grids[--r][c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}// 左斜相连if (row<m-3&&col>=3){int r = row;int c = col;while (statist != 0 && grids[++r][--c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}// 右斜相连if (row<m-3&&col<n-3){int r = row;int c = col;while (statist != 0 && grids[++r][++c] == grids[r][c]) {count++;statist--;}if (count == 3) {return true;}count = 0;statist = 3;}return false;}
}
【华为笔试】【模拟】【Java】竖直四子棋相关推荐
- 华为OD机试 - 竖直四子棋
题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时获胜. 现 ...
- 20222023华为OD机试 - 竖直四子棋(Python)
竖直四子棋 题目 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时 ...
- 华为OD机试题 - 竖直四子棋(JavaScript)| 包含代码编写思路
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...
- 2022 华为OD机试真题 Python 实现【竖直四子棋】
所有题目均有三种语言实现.C++ 实现目录.Python实现目录.Java实现目录 题目 题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上, ...
- 华为OD机试真题Python实现【竖直四子棋】真题+解题思路+代码(20222023)
竖直四子棋 题目 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时 ...
- 【华为OD机试真题 python】竖直四子棋【2022 Q4 | 200分】
■ 题目描述 [竖直四子棋] 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向 ...
- 题目0134-竖直四子棋
竖直四子棋 题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一 ...
- java三手交换智能下棋代码,基于Java的六子棋人工智能系统的设计研究
基于Java的六子棋人工智能系统的设计研究 邱烨,杨旭,王伟 中国矿业大学计算机科学与技术学院,徐州(221008) 摘要:六子棋作为一个刚刚兴起不久的棋类游戏,其计算机博弈算法的研究还相对较少.六子 ...
- 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜
四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...
最新文章
- 为基于树的机器学习模型构建更好的建模数据集的10个小技巧!
- 23种设计模式之外观模式(Facade)
- 快速上手seajs——简单易用Seajs
- 指定开始_@高坪人,熏腊肉开始啦!指定地点仅限这9个地方,别走错啦
- 计算机lab模式适用于,计算机考证二级选择题1
- MySQL关键字EXPLAIN的用法及其案例
- 轻操作动作休闲单机游戏《狂斩三国2》评测
- Shell(Bash)中如何判断是否存在某个命令
- 蓝桥杯 ALGO-14 算法训练 回文数
- CloudStack 4.4+KVM之通过ISO文件创建CentOS虚拟机
- 进销存excel_EXCEL进销存系统升级版,自动库存更新,利润毛利分析一键操作
- kjb文件 解析_十四期全国BIM一级考试真题及解析
- PhotoShop 将图片裁剪为圆形 并加边框
- 英国“脱欧”促中国企业调整在欧战略
- android菜单键 r9,Android OPPO R9 后台 无法启动 Activity 问题
- 原生Android设置sim卡锁定,如何为更安全的Android手机设置SIM卡锁 | MOS86
- Ubuntu14.04 64位网易云播放器
- dockerfile构建LNRP环境练手
- PHP Composers 手动配置第三方扩展
- AJPFX:什么是外汇交易