二维数组
二维数组格式:
- 格式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;
}
}