■ 题目描述
竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。
一方的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】竖直四子棋相关推荐

  1. 华为OD机试 - 竖直四子棋

    题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时获胜. 现 ...

  2. 20222023华为OD机试 - 竖直四子棋(Python)

    竖直四子棋 题目 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时 ...

  3. 华为OD机试题 - 竖直四子棋(JavaScript)| 包含代码编写思路

    最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...

  4. 2022 华为OD机试真题 Python 实现【竖直四子棋】

     所有题目均有三种语言实现.C++ 实现目录.Python实现目录.Java实现目录 题目 题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上, ...

  5. 华为OD机试真题Python实现【竖直四子棋】真题+解题思路+代码(20222023)

    竖直四子棋 题目 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一线时 ...

  6. 【华为OD机试真题 python】竖直四子棋【2022 Q4 | 200分】

    ■ 题目描述 [竖直四子棋] 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向 ...

  7. 题目0134-竖直四子棋

    竖直四子棋 题目描述 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子, 棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子. 一方的4个棋子横.竖或者斜方向连成一 ...

  8. java三手交换智能下棋代码,基于Java的六子棋人工智能系统的设计研究

    基于Java的六子棋人工智能系统的设计研究 邱烨,杨旭,王伟 中国矿业大学计算机科学与技术学院,徐州(221008) 摘要:六子棋作为一个刚刚兴起不久的棋类游戏,其计算机博弈算法的研究还相对较少.六子 ...

  9. 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜

    四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...

最新文章

  1. 为基于树的机器学习模型构建更好的建模数据集的10个小技巧!
  2. 23种设计模式之外观模式(Facade)
  3. 快速上手seajs——简单易用Seajs
  4. 指定开始_@高坪人,熏腊肉开始啦!指定地点仅限这9个地方,别走错啦
  5. 计算机lab模式适用于,计算机考证二级选择题1
  6. MySQL关键字EXPLAIN的用法及其案例
  7. 轻操作动作休闲单机游戏《狂斩三国2》评测
  8. Shell(Bash)中如何判断是否存在某个命令
  9. 蓝桥杯 ALGO-14 算法训练 回文数
  10. CloudStack 4.4+KVM之通过ISO文件创建CentOS虚拟机
  11. 进销存excel_EXCEL进销存系统升级版,自动库存更新,利润毛利分析一键操作
  12. kjb文件 解析_十四期全国BIM一级考试真题及解析
  13. PhotoShop 将图片裁剪为圆形 并加边框
  14. 英国“脱欧”促中国企业调整在欧战略
  15. android菜单键 r9,Android OPPO R9 后台 无法启动 Activity 问题
  16. 原生Android设置sim卡锁定,如何为更安全的Android手机设置SIM卡锁 | MOS86
  17. Ubuntu14.04 64位网易云播放器
  18. dockerfile构建LNRP环境练手
  19. PHP Composers 手动配置第三方扩展
  20. AJPFX:什么是外汇交易

热门文章

  1. word 分章节,如何下一章页眉单独改动,不影响上一章
  2. 基于unity的2D横版游戏开发日志 小结
  3. 品牌的价值 龚文祥的第六次跳槽
  4. C++ 快速学习(一)
  5. 2022最新话费充值系统源码+安装教程
  6. P2698 [USACO12MAR]Flowerpot S
  7. CPU和GPU的简介
  8. 嵌入式Web项目(一)——Web服务器的引入
  9. Button点击事件
  10. Linux检查图形化界面是否安装