习题3--函数和数组2

在这里插入图片描述

import java.util.*;
class Class33{
    /*
    1.提示用户输入元素
    2.判断其中是否有4个连续一样的
    3.输出
     */
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter the number of values:");
        int num=scanner.nextInt();
        int[] arr=new int[num];
        System.out.print("Enter the values:");
        for(int i=0;i<arr.length;i++){
            arr[i]=scanner.nextInt();
        }
        if(isConsecutiveFour(arr)){
            System.out.println("The list consecutive fours");
        }else{
            System.out.println("The list has no consecutive fours");
        }
    }
    public static boolean isConsecutiveFour (int[] arr){
        for(int i=0;i<arr.length;i++){
            int sum=1; //角标差  判断其是否连续
            int count=1;//元素相等的个数
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]==arr[i]&&j-i==sum){
                    count++;
                    sum++;
                } 
                if(count==4){
                    return true;
                }
            }           
        }
        return false;
        
    }
}

在这里插入图片描述

import java.util.Scanner;
class Class29{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int[] arr=new int[100];//定义了一个空数组,之中的数默认都为0,用其存储数的次数
        int num;
        System.out.print("Enter the integers between 1 and 100:");
        while(true){
            num=scanner.nextInt();
            if(num==0){//输入0跳出
                break;
            }
            arr[num-1]++;//在num-1位置存储num的次数
        }
        for(int i=0;i<arr.length;i++){//遍历数组
            if(arr[i]==1){
                System.out.println((i+1)+" occurs 1 time");//num-1=i,所以输出数为i+1
            }else if(arr[i]>1){
                System.out.println((i+1)+" occurs "+arr[i]+" times");
            }
        }
    }
   
}

在这里插入图片描述

import java.util.*;
class Class36{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        Random random=new Random();
        System.out.print("Enter the size for the matrix: ");
        int num=scanner.nextInt();
        int[][] arr=new int[num][num];
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
                arr[i][j]=random.nextInt(2);//arr[i][j]=Math.random()>0.5?1:0;
                System.out.print(arr[i][j]);
            }
            System.out.println();
        }
        row(arr);//行
        column(arr);//列
        diagonal(arr);//主对角线
        subdiagonal(arr);//副对角线
    }
    public static void row(int[][] arr){
        for(int i=0;i<arr.length;i++){
            int flag=1;
            for(int j=1;j<arr[i].length;j++){
                if(arr[i][0]!=arr[i][j]){
                    flag=-1;//标记程序是正常结束还是跳出
                    break;
                }
            }
            if(flag==1){//正常结束,说明该行元素相同
                 System.out.println("All "+arr[i][0]+"s on row "+i);
            }   
        }
    }
    public static void column(int[][] arr){
            for(int j=0;j<arr.length;j++){
                int flag=1;
                for(int i=1;i<arr.length;i++){
                    if(arr[0][j]!=arr[i][j]){//判断列
                        flag=-1;
                        break;
                    }
                }
                if(flag==1){
                    System.out.println("All "+arr[0][j]+"s on column "+j);
                }     
            } 
    }
    public static void diagonal(int[][] arr){
        int flag=1;
        for(int i=0;i<arr.length;i++){
            if(arr[0][0]!=arr[i][i]){//主对角线的元素坐标行列相同
                flag=-1;
                System.out.println("No same numbers on the major diagonal");
                break;
            }
        }
        if(flag==1){
            System.out.println("major daigonal is "+arr[0][0]);
        }
    }
    public static void subdiagonal(int[][] arr){
        int flag=1;
        for(int i=0,j=arr.length-1;i<arr.length-1&&j>=0;i++,j--){
            if(arr[i][j]!=arr[i+1][j-1]){
                flag=-1;
                System.out.println("No same numbers on the sub-diagonal");
                break;
            }
        }
        if(flag==1){
            System.out.println("sub-daigonal is "+arr[0][arr.length-1]);
        }
    }
}

4.在这里插入图片描述

import java.util.*;
class Home32{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter list1: ");
        int num1=scanner.nextInt();
        int[] arr1=new int[num1];
        for(int i=0;i<arr1.length;i++){
            arr1[i]=scanner.nextInt();
        }
        System.out.print("Enter list2: ");
        int num2=scanner.nextInt();
        int[] arr2=new int[num2];
        for(int j=0;j<arr2.length;j++){
            arr2[j]=scanner.nextInt();
        }
        int[] arr3=new int[arr1.length+arr2.length];
        int p1=0;
        int p2=0;
        for(int i=0;i<arr3.length;i++){
            if(p1>=arr1.length){//arr1输出结束  把剩下的arr2元素全部放入新的数组中
                arr3[i]=arr2[p2++];
            }else if(p2>=arr2.length){//arr2输出结束   把剩下的arr1元素全部放入新的数组中
                arr3[i]=arr1[p1++];
            }else if(arr1[p1]<=arr2[p2]){//二者都未输出结束,比较大小
                arr3[i]=arr1[p1++];
            }else{
                arr3[i]=arr2[p2++];
            }
        }
         System.out.println("The merged list is "+Arrays.toString(arr3));
    }
}

5.五子棋

import java.util.Scanner;
class WuZiQi{
        /*
        1.创建一个棋盘
        2.对棋盘进行初始化
        3.打印棋盘
        4.开始游戏
         */
    //1.创建一个棋盘
    public static String[][] board=null;//定义一个棋盘数组  全局变量  初始化还需在主函数中
    public static Scanner scanner=new Scanner(System.in);
    public static void main(String[] args){
        //2.对棋盘进行初始化
        initBoard();
        //3.打印棋盘
        printBoard();
        //4.开始游戏
        startGames();
    }
    public static void initBoard(){
        board=new String[15][15];
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]="+";
            }
        }
    }
    public static void printBoard(){
        System.out.print("   ");
        for(int i=1;i<=15;i++){
            System.out.printf("%-3d",i);//打印列编号
        }
        System.out.println();//换行
        for(int i=0;i<board.length;i++){
            System.out.printf("%-3d",i+1);//打印行编号
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j]+"  ");//打印棋盘
            }
            System.out.println();
        }
    }
    public static void startGames(){
        int player=0;
        while(!isGameOver()){//游戏未结束为循环条件
            if(player%2==0){
                System.out.println(">>>黑方下棋:");
                if(!xiaqi("o")){//为false,说明当前位置已经存在棋子,跳到下一循环,黑方继续下棋
                    continue;
                }
            }else{
                System.out.println(">>>白方下棋:");
                if(!xiaqi("#")){
                    continue;
                }
            }
            player++;
        }
        System.out.println(">>>游戏结束");
    }
    public static boolean xiaqi(String chess){
        System.out.print(">>>请输入X坐标:");
        int x=scanner.nextInt()-1;//标注行数差一
        System.out.print(">>>请输入Y坐标:");
        int y=scanner.nextInt()-1;
        if(board[x][y].equals("+")){//需判断当前位置是否已经标记,如果已经标记就得重新输入
            board[x][y]=chess;//当前位置为某一方符号
            printBoard();//重新打印棋谱打印当前的棋谱
            return true;
        }else{
            System.out.println(">>>棋子已存在,请重新下棋!");//当前位置已存在棋子
            return false;
        }
    }
    public static boolean isGameOver(){
        for(int i=0;i<board.length;i++){//遍历棋盘
            for(int j=0;j<board[i].length;j++){
                if(!board[i][j].equals("+")){//如果当前位置不为空然后开始从四个方向开始找
                    //向右
                    if(j<11){
                        boolean flag=true;
                        for(int dy=1;dy<=4;dy++){
                            if(board[i][j]!=board[i][j+dy]){
                               flag=false;//设标记flag的原因是,当前方向如果不行,不能直接结束,还要判断其他方向,
                               break;//当其他方向都不行的话,就返回false,游戏结束
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向下
                    if(i<11){
                        boolean flag=true;
                        for(int dx=1;dx<=4;dx++){
                            if(board[i][j]!=board[i+dx][j]){
                               flag=false;
                               break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向右下
                    if(i<11&&j<11){
                        boolean flag=true;
                        for(int d=1;d<=4;d++){
                            if(board[i][j]!=board[i+d][j+d]){
                               flag=false;
                               break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向右上
                    if(i>3&&j<11){
                        boolean flag=true;
                        for(int d=1;d<=4;d++){
                            if(board[i][j]!=board[i-d][j+d]){
                               flag=false;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
}

解析:该题在判断是否连成五子的时候,现实情况中可从八个方向中找,但其实上和下,左和右,右上和左下,左上和右下都是一样的,所以我们只需从四个方向找其限制条件,然后判断该方向是否有连续五个棋子,如下图,
在这里插入图片描述/////这次总结的习题都是我在做题过程中觉得比较典型的题,如果你有更好的解法,欢迎在下方评论哦,我们共同进步////////

发布了49 篇原创文章 · 获赞 4 · 访问量 913

猜你喜欢

转载自blog.csdn.net/weixin_45404784/article/details/103031522