Java基础07(二维数组)

1.二维数组:二维数组的本质就是一个一维数组!只不过所存储的元素是另一个一维数组而已。(行列式,矩阵)

        1)三种定义格式:

             数据类型[][] 数组名=new int[row][col];

             数据类型[][] 数组名=new int[][]{ {第1行},{第2行},{第3行}};

              数据类型[][] 数组名={{第1行},{第2行},{第3行}};

              注意: 使用语法 new int[][]创建数组时,必须指定第一个下标

         2)二维数组的长度:

             定义一个数组:int[][]  x=new int[3][4];  数组x的长度为x.length;  x[0].length是数组x[0]的长度。如图所示 

         3)锯齿数组:二维数组中的每一行本身就是一个数组因此各行的长度就可以不同, 如下图所示:

   

           4)遍历二维数组:

     
      int[][] matrix=new int[5][4];
      for(int i=0;i<matrix.length;i++){     //二维数组的行数
            for(int j=0;j<matrix[i].length;j++){  //二维数组每行的个数
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println();
      }

            5) 矩阵的转置的代码如下:

 

import java.util.Scanner;
class Zhuanzhi{
    public static void main(String args[]){
        Scanner Sc = new Scanner(System.in);
        System.out.print("请输入二维数组的行和列:");
        int row = Sc.nextInt();        //数组arr的行
        int col =  Sc.nextInt();       //数组arr的列
        double  arr[][] = new double[row][col];     //创建数组arr
        for(int i=0;i<row;i++){        //遍历数组对数组初始化
            for(int j=0; j<col;j++){
                arr[i][j]=Sc.nextDouble();
            }
        }
        double  newarr[][] = new double[col][row];   //创建新数组 将原数组的行和列颠倒
        for(int i=0;i<col;i++){
            for(int j=0; j<row;j++){
                newarr[i][j] = arr[j][i];         //将原数组的第j行第i列元素赋给新数组的第i
                                                  //行第j列
                System.out.print(newarr[i][j]+" ");
                
            }
            System.out.println();
        }
        



    }
}

           6)矩阵的乘法:设A为m*p的矩阵,B为的p*n矩阵,那么称m*n的矩阵C为矩阵AB的乘积,记作C=AB,其中矩阵C中 的第i行第j列元素可以表示为:

class juZhenMutil{
    public static void main(String args[]){
        int[][]  arr = new int[][]{
            {1,2,3},
            {4,5,6}
        };
        int[][] arr1 = new int[][]{
            {1,4},
            {2,5},
            {3,6}
        };
        int[][] newarr = new int[arr.length][arr1[0].length]; //新数组的行为arr的行      
                                                              //列为arr1的列
        //遍历新数组对其赋值
        for(int i=0;i<newarr.length;i++){
       
            for(int j=0;j<newarr[i].length;j++){
                  int sum=0;
                  for(int k=0;k<arr1.length;k++){
                      sum+=arr[i][k]*arr1[k][j];         //矩阵乘法公式    
                  }
                  newarr[i][j]=sum;
                  System.out.print(newarr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

             7)编写代码可以完成五子棋的基本操作:

import java.util.Scanner;
class WuZiQi{
    //定义一个全局的棋盘
    public static String[][] board;
    //定义棋盘的尺寸size*size final类型 不可修改变量的值
    public static final int SIZE=15;
    public static final String NULL_CHESS="+ ";   //空棋子
    public static final String BLACK_CHESS="X ";  //黑棋子
    public static final String WHITE_CHESS="O ";   //白棋子
    public static Scanner scanner=new Scanner(System.in);

    public static void main(String[] args){
        //制作棋盘
        initBoard();
        //打印棋盘
        showBoard();
        //开始游戏
        startGame();
    }
    public static void startGame(){
        int player=0;
        int result=0;
        while((result=isGameOver())==0){
            if(player%2==0){    //黑方
                System.out.println(">>>请黑方下棋:");
                if(!putChess(BLACK_CHESS)){
                    System.out.println(">>>此处已有棋子,请从新下棋!");
                    continue;
                }
            }else{              //白方
                System.out.println(">>>请白方下棋:");
                if(!putChess(WHITE_CHESS)){
                    System.out.println(">>>此处已有棋子,请从新下棋!");
                    continue;
                }
            }
            player++;
        }
        if(result==1){
            if(player%2==1){
                System.out.println(">>>游戏结束!黑方胜!");
            }else{
                System.out.println(">>>游戏结束!白方胜!");
            }
        }else{
            System.out.println(">>>游戏结束!和棋!");
        }
        
        
    }
    public static int isGameOver(){
        int count=0;
        //累计棋子的个数 然后再判断是否五子连珠
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                if(!board[i][j].equals(NULL_CHESS)){
                    count++;
                    //当前的坐标 i j
                    //向右是否连珠 (i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)
                    if(j<11){
                        if(board[i][j].equals(board[i][j+1])
                            &&board[i][j].equals(board[i][j+2])
                            &&board[i][j].equals(board[i][j+3])
                            &&board[i][j].equals(board[i][j+4])){
                                return 1;
                        }
                    }
                    //向下是否连珠
                    if(i<11){
                        if(board[i][j].equals(board[i+1][j])
                            &&board[i][j].equals(board[i+2][j])
                            &&board[i][j].equals(board[i+3][j])
                            &&board[i][j].equals(board[i+4][j])){
                                return 1;
                        }
                    }
                    //向右下是否连珠
                    if(i<11&&j<11){
                        if(board[i][j].equals(board[i+1][j+1])
                            &&board[i][j].equals(board[i+2][j+2])
                            &&board[i][j].equals(board[i+3][j+3])
                            &&board[i][j].equals(board[i+4][j+4])){
                                return 1;
                        }
                    }
                    //向右上是否连珠
                    if(i>3&&j<11){
                        if(board[i][j].equals(board[i-1][j+1])
                            &&board[i][j].equals(board[i-2][j+2])
                            &&board[i][j].equals(board[i-3][j+3])
                            &&board[i][j].equals(board[i-4][j+4])){
                                return 1;
                        }
                    }
                }
            }
        }
        //判断和棋 棋子数==SIZE*SIZE
        if(count==SIZE*SIZE){
            return 2;    
        }
        return 0;
    }
    public static boolean putChess(String chess){
        System.out.print(">>>x=");
        int x=scanner.nextInt()-1;  //x 行
        System.out.print(">>>y=");
        int y=scanner.nextInt()-1;  //y 列
        if(board[x][y].equals(NULL_CHESS)){
            board[x][y]=chess;
            showBoard();
            return true;       //已下
        }else{
            showBoard();
            return false;     //未下
        }
    }
    public static void showBoard(){
        System.out.print("  ");
        for(int i=1;i<=SIZE;i++){
            System.out.printf("%-2d",i);
        }
        System.out.println();
        int index=1;
        for(int i=0;i<board.length;i++){
            System.out.printf("%-3d",index++);
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
    }
    public static void initBoard(){
        board=new String[SIZE][SIZE];   //字符串是引用数据类型 默认初始值null
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]=NULL_CHESS;  //利用+打印棋盘
            }
        }
    }
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值