• 华为上机:五子棋


    (粤港澳补充题)五子棋
    描述:

    此题目限定的五子棋规则:

    1、棋盘大小:15*15

    2、分为黑棋和白棋,一种颜色棋子不论横、竖、斜连成5个或大于5个算赢

    3、黑白交替下,也就是说一方不能连续2次成功落子。

    要求:根据双方落子,进行有效性判断和胜负判断。

    运行时间限制: 无限制
    内存限制: 无限制
    输入:

    输入一行或多行,每行包括三个整数,分别是棋子类型,棋子的横坐标,棋子的纵坐标,以空格隔开

    棋子类型:0  黑棋,1 白棋

    棋子坐标从0开始,小于15。

    输出:

    针对每行输入,如果:

    黑方胜,输出1;

    白方胜,输出2;

    落子失败,比如坐标错误,或顺序错,输出-1;

    其他情况:落字成功,不输出;

    胜负一旦确定,测试用例就结束。

    样例输入:
    0 7 7
    1 7 8
    0 7 7
    1 7 5
    0 8 8
    1 9 9
    0 6 6
    1 8 9
    0 5 5
    1 7 9
    0 4 4
    样例输出:
    -1
    -1
    1

    解题

    判断是否连成五指棋比较简单,判断合法的下棋顺序话费了很长时间

    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.Scanner;
    public class Main3{
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            int[][] a = new int[15][15];
            for(int i=0;i<15;i++){
                for(int j=0;j<15;j++){
                    a[i][j] = -1;
                }
            }
            int i = 0;
            int first = 1;
            int next = 2;
            int target = -1;
            while(in.hasNext()){
                String[] point = in.nextLine().split(" ");
                if(!isLeague(point)){
                    System.out.println("-1");
                    continue;
                }
                    
                int opt = Integer.parseInt(point[0]);
                int x = Integer.parseInt(point[1]);
                int y = Integer.parseInt(point[2]);
                if(a[x][y]!=-1){
                    System.out.println("-1");
                    continue;
                }
                if(i==0){ // 第0次下棋:first 1 next 2
                    first = 2 ;// 下一次棋子
                    next = 1;
                    i++;
                    target = opt;// 第0次下的棋子
                }else{
                    if(i%2==0){ 
                        if(target != opt){// 偶数位和第0次下的棋子应该一样  first 1 next 2
                            System.out.println("-1");
                            continue;
                        }
                        if(first==1&&next==2){ // 判断是否是该子下棋,是的更新到下一个下棋棋子
                           
                           first = 2;
                           next = 1;
                           i++;
                        }else{
                            System.out.println("-1");
                            continue;
                        }
                    }else{
                        if(target == opt){ // 偶数位和第0次下的棋子不应该一样 
                            System.out.println("-1");
                            continue;
                        }
                        if(first==2&&next==1){ // 判断是否是该子下棋,是的更新到下一个下棋棋子
                            
                           first = 1;
                           next = 2;
                           i++;
                        }else{
                            System.out.println("-1");
                            continue;
                        }
                    }
                }
                
                a[x][y]=opt;
                if(isWin(a,x,y)){
                    if(opt==0){
                        System.out.println("1");
                    }else{
                        System.out.println("2");
                    }
                    break;
                }
            }
            
            in.close();
        }
        /**
         * 四个方向判断是否赢
         * @param a
         * @param x
         * @param y
         * @return
         */
        public static boolean isWin(int[][] a,int x,int y){
            int  target = a[x][y];
            int count = 1;
            int i = x;
            int j = y;
            // 上下
            while(i<14){
                i++;
                if(a[i][y]==target){
                    count++;
                }
            }
            i = x;
            while(i>=1){
                i--;
                if(a[i][y]==target){
                    count++;
                }
            }
            if(count>=5){
                return true;
            }
            // 左右
            count = 1;
            j = y;
            while(j<14){
                j++;
                if(a[x][j]==target){
                    count++;
                }
            }
            j = y;
            while(j>=1){
                j--;
                if(a[x][j]==target){
                    count++;
                }
            }
            if(count>=5){
                return true;
            }
            // 左上右下
            i = x;
            j = y;
            count = 1;
    
            while(i<14&&j<14){
                j++;
                i++;
                if(a[i][j]==target){
                    count++;
                }
            }
            i = x;
            j = y;
            while(j>=1&&i>=1){
                j--;
                i--;
                if(a[i][j]==target){
                    count++;
                }
            }
            if(count>=5){
                return true;
            }
            
            // 左下右上
            i = x;
            j = y;
            count = 1;
    
            while(i>=1&&j<14){
                j++;
                i--;
                if(a[i][j]==target){
                    count++;
                }
            }
            i = x;
            j = y;
            while(j>=1&&i>14){
                j--;
                i++;
                if(a[i][j]==target){
                    count++;
                }
            }
            if(count>=5){
                return true;
            }
            return false;
        }
        /**
         * 输入是否合法
         * @param point
         * @return
         */
        public static boolean isLeague(String[] point){
            if(point==null ||point.length!=3){
                return false;
            }
                
            if(!(point[0].equals("0")||point[0].equals("1"))){
    //            System.out.println(0);
                return false;
            }
                
            int x = Integer.parseInt(point[1]);
            if(x<0 ||x>=15){
    //            System.out.println("X");
                return false;
            }
                
            int y = Integer.parseInt(point[2]);
            if(y<0 ||y>=15){
    //            System.out.println("Y");
                return false;
            }
                
            return true;
        }
    }
  • 相关阅读:
    微软算法100题25 查找连续最长的数字串
    微软算法100题24 就地逆序单链表
    微软算法100题21 数列中所有和为特定值的组合
    微软算法100题20 字符串转整数 atoi
    约瑟夫环
    微软算法100题17 字符串中找到第一个只出现一次的字符
    微软算法100题16 按层遍历二叉树
    微软算法100题15 求二元查找树的镜像
    微软算法100题14 在排序数组中找到和为指定数的任意两个元素
    NLP(十) 主题识别
  • 原文地址:https://www.cnblogs.com/theskulls/p/5707134.html
Copyright © 2020-2023  润新知