1275.找出井字棋的获胜者(Java)

2024-02-05 00:36

本文主要是介绍1275.找出井字棋的获胜者(Java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

A 和 B 在一个 3 x 3 的网格上玩井字棋。
井字棋游戏的规则如下:
玩家轮流将棋子放在空方格 (" ") 上。
第一个玩家 A 总是用 “X” 作为棋子,而第二个玩家 B 总是用 “O” 作为棋子。
“X” 和 “O” 只能放在空方格中,而不能放在已经被占用的方格上。
只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
如果所有方块都放满棋子(不为空),游戏也会结束。
游戏结束后,棋子无法再进行任何移动。
给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。
如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 “Draw”;如果仍会有行动(游戏未结束),则返回 “Pending”。
你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。

输入:

moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]

输出:

“A”
解释:“A” 获胜,他总是先走。
"X " "X " "X " "X " "X "
" " -> " " -> " X " -> " X " -> " X "
" " "O " "O " "OO " “OOX”

代码实现:

//找到井字棋的获胜者
public class Main{public static void main(String[] args) {int[][] moves = new int[][]{{0, 0}, {2, 0}, {1, 1}, {2, 1}, {2, 2}};System.out.println(tictactoe(moves));//A}public static String tictactoe(int[][] moves) {int[][] plate = new int[3][3];//定义一个棋盘int flag = 1;//下棋顺序:1为A,0为B//规定A棋子为1,B棋子为2for (int i = 0; i < moves.length; i++) {//开始下棋int[] arr = moves[i];//每一步棋下的位置if (flag == 1) {//A下plate[arr[0]][arr[1]] = 1;//切换到B下flag = 0;} else {//B下plate[arr[0]][arr[1]] = 2;//切换到A下flag = 1;}}//判定胜负if (whoIsWinner(plate, 1)) {//如果A胜return "A";} else if (whoIsWinner(plate, 2)) {//B胜return "B";} else {//要么是平局 要么还未结束//先判定是否结束for (int i = 0; i < plate.length; i++) {for (int j = 0; j < plate[i].length; j++) {if (plate[i][j] == 0) {return "Pending";//还未结束}}}}//剩下的情况就是平局return "Draw";}/*** 判定当前棋局有结果时的胜者** @param plate 棋局的二维数组* @param x     假定的胜者的棋子元素* @return 假定是否成立*/public static boolean whoIsWinner(int[][] plate, int x) {int flag = 1;//标记变量:x元素是胜者为1//1判断行for (int i = 0; i < plate.length; i++) {//每一行判断是重置标记变量flag = 1;for (int j = 0; j < plate[i].length; j++) {//排成一行的情况if (plate[i][j] != x) {flag = 0;break;}}//出现一行一致时,则直接跳出if (flag == 1) {return true;}}//2判断列for (int i = 0; i < plate.length; i++) {//每一列判断是重置标记变量flag = 1;for (int j = 0; j < plate[i].length; j++) {//排成一列的情况if (plate[j][i] != x) {flag = 0;break;}}//出现一列一致时,则直接返回if (flag == 1) {return true;}}flag = 1;//重置//3排成对角线的情况for (int i = 0; i < plate.length; i++) {//主对角if (plate[i][i] != x) {flag = 0;}}//如果主对角线上符合胜利规则,返回结果 反之重置变量if (flag == 1) {return true;} else {flag = 1;}//4排成反对角线的情况for (int i = plate.length - 1; i >= 0; i--) {//反对角if (plate[i][plate.length - i - 1] != x) {flag = 0;}}//判定反对角的结果return flag == 1;}
}

这篇关于1275.找出井字棋的获胜者(Java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679268

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S