二维数组的概念及使用,附五子棋,八皇后案例

二维数组

 

二维数组格式:

  • 格式1:数据类型[][] 变量名 = new 数据类型[m][n];
  • 格式2:数据类型[][] 变量名 = new 数据类型[m][];
  • 格式3:数据类型[][] 变量名 = new 数据类型[] []{{...},{...},{...},...}
    • 数据类型[][] 变量名 = {{...},{...},{...},...}

注意:

二维数组的本质就是一维数组,只不过所储存的元素是另一个一维数组。

二维数组中的元素通过行和列的下标来访问

使用语法 new int[5][] 创建数组时,必须指定第一个下标。语法 new int[][] 是 错误的

        //定义一个int类型的5行4列的二维数组
        int[][] matrix=new int[5][4];

获取二维数组的长度:

二维数组实际上是一个数组,它的每个元素都是一个一维数组。数组 x的长度是数组中元素的个数,可以用x.length 获取该值。元素 x[0], x[1],…,x[x.length-1]也是数组。 可以使用 x[0].length, x[1].length,…, x[x.length-1].length 获取它们的长度。 

        //打印该二维数组的行数
        System.out.println(matrix.length);
        //maxtrix[i] 指的是第i+1位置上的元素(另一个一维数组)
        //打印该二维数组该行的列数
        System.out.println(matrix[0].length);

锯齿数组:不常用

二维数组中的每一行本身就是一个数组,因此,各行的长度就可以不同。这样的数组称为锯齿数组。

案例:遍历数组

class Demo01{
    public static void main(String[] args){
        //定义一个int类型的5行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();
        }        
    }
}

五子棋案例:

import java.util.Scanner;

public 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++;
        }
        //result = 1 为有胜利方
        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;
            }
        }
    }
}

八皇后案例:

/*
八皇后问题
指的是在一个8*8的棋盘里
每一个格子都可以放皇后这个棋子
但是有一个规则:
同行 同列 同斜线(左,右) 上只能存在一个皇后
问:棋盘存在8个皇后 有几种可能?
 */
class EightQueen{
    public static int count=0;

    public static void main(String[] args){
        //1.定义一个二维数组
        int[][] arr=new int[8][8];
        eightQueen(0,arr);
    }
    public static void eightQueen(int row,int[][] arr){
        if(row==8){
            count++;
            System.out.println("第"+count+"种情况:");
            for(int i=0;i<arr.length;i++){
                for(int j=0;j<arr[i].length;j++){
                    System.out.print(arr[i][j]+" ");
                }
                System.out.println();
            }
        }else{
            //复制一份
            int[][] newArr=new int[8][8];
            for(int i=0;i<newArr.length;i++){
                for(int j=0;j<newArr[i].length;j++){
                    newArr[i][j]=arr[i][j];
                }
            }
            for(int j=0;j<8;j++){
                //如果row行j列没有危险
                if(noDangerous(row,j,newArr)){
                    //把当前行都清空
                    for(int c=0;c<8;c++){
                        newArr[row][c]=0;
                    }
                    newArr[row][j]=1;
                    eightQueen(row+1,newArr);
                }
            }
        }
    }
    public static boolean noDangerous(int row,int col,int[][] arr){
        //上
        for(int r=row-1;r>=0;r--){
            if(arr[r][col]==1){
                return false;
            }
        }
        //左上
        for(int r=row-1,c=col-1;r>=0&& c>=0;r--,c--){
            if(arr[r][c]==1){
                return false;
            }
        }
        //右上
        for(int r=row-1,c=col+1;r>=0&& c<8;r--,c++){
            if(arr[r][c]==1){
                return false;
            }
        }
        return true;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值