阿里笔试题:小红的四子棋
2022年4月15日阿里笔试题
(回忆)
小红和小紫下四子棋,现在给一个棋盘的状态,判断当前是否有人赢了,或者是还未分胜负。当一方有四个棋子连成一横或者一竖或者斜对角线时获胜。
输入:
第一行两个数字空格隔开,表示棋盘行数 n 和列数 m 。 后面跟着 n 行,每行 m 个字符,表示棋盘每个位置的状态。
其中 ‘.’ 表示没有放棋子的空位置,‘r’ 表示小红下的棋子,‘p’ 表示小紫下的棋子。
输出:
当前棋盘的状态。如果小红赢了,输出 “kou” ;如果小紫赢了,输出 “yukari” ;如果还没分出胜负,输出 “to be continued” 。
【拙劣解法,欢迎指教】
import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {String nm = in.nextLine();int n = Integer.parseInt(nm.split(" ")[0]);int m = Integer.parseInt(nm.split(" ")[1]);char[][] chess = new char[n][m];for (int i = 0; i < n; i++) {String inStr = in.nextLine();for (int j = 0; j < m; j++) {chess[i][j] = inStr.charAt(j);}}System.out.println(check(chess, n, m));}}private static String check(char[][] chess, int n, int m) {int[][] lr = new int[n][m]; // 当前位置左边有多少个连续的 'r'int[][] ur = new int[n][m]; // 当前位置上边有多少个连续的 'r'int[][] lur = new int[n][m]; // 当前位置左上边有多少个连续的 'r'int[][] ldr = new int[n][m]; // 当前位置左下边有多少个连续的 'r'int[][] lp = new int[n][m]; // 当前位置左边有多少个连续的 'p'int[][] up = new int[n][m]; // 当前位置上边有多少个连续的 'p'int[][] lup = new int[n][m]; // 当前位置左上边有多少个连续的 'p'int[][] ldp = new int[n][m]; // 当前位置左下边有多少个连续的 'p'// 左边、上边、左上边for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (chess[i][j] == 'r') {lr[i][j] = 1;ur[i][j] = 1;lur[i][j] = 1;if (i > 0) {ur[i][j] += ur[i - 1][j];}if (j > 0) {lr[i][j] += lr[i][j - 1];}if (i > 0 && j > 0) {lur[i][j] += lur[i - 1][j - 1];}if (lr[i][j] == 4 || ur[i][j] == 4 || lur[i][j] == 4) {return "kou";}} else if (chess[i][j] == 'p') {lp[i][j] = 1;up[i][j] = 1;lup[i][j] = 1;if (i > 0) {up[i][j] += up[i - 1][j];}if (j > 0) {lp[i][j] += lp[i][j - 1];}if (i > 0 && j > 0) {lup[i][j] += lup[i - 1][j - 1];}if (lp[i][j] == 4 || up[i][j] == 4 || lup[i][j] == 4) {return "yukari";}}}}// 左下边的要单独算for (int i = n - 1; i >= 0; i--) {for (int j = 0; j < m; j++) {if (chess[i][j] == 'r') {ldr[i][j] = 1;if (i < n - 1 && j > 0) {ldr[i][j] += ldr[i + 1][j - 1];}if (ldr[i][j] == 4) {return "kou";}} else if (chess[i][j] == 'p') {ldp[i][j] = 1;if (i < n - 1 && j > 0) {ldp[i][j] += ldp[i + 1][j - 1];}if (ldp[i][j] == 4) {return "yukari";}}}}return "to be continued";}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
