java语言程序设计基础篇——多维数组(2)

import java.util.Scanner;

public class Exercise8_19 {
	public static boolean isConsecutiveFour(int[][] values){
		int numberOfRows = values.length;
		int numberOfColumns = values[0].length;
		for(int i=0;i<numberOfRows;i++){//判断每一行是否有四个连续的数字
			if(isConsecutiveFour(values[i]))
				return true;
		}
		
		for(int j=0;j<numberOfColumns;j++){//判断每一列是否有四个连续的数字
			int[] column = new int[numberOfRows];
			for(int i=0;i<numberOfRows;i++)
		        column[i] = values[i][j];
			if(isConsecutiveFour(column))
		        return true;
		}
		
		for(int i=0;i<numberOfRows-3;i++){判断主对角线下半部分是否有四个连续的数字
			int numberOfElementsInDiagonal = Math.min(numberOfRows-i,numberOfColumns);     
		    int[] diagonal = new int[numberOfElementsInDiagonal];
		    for(int k=0;k<numberOfElementsInDiagonal;k++)
		        diagonal[k] = values[k+i][k];
		    if (isConsecutiveFour(diagonal))
		        return true;
		}
		
		for(int j=1;j<numberOfColumns-3;j++){//判断主对角线上半部分是否有四个连续的数字
			int numberOfElementsInDiagonal= Math.min(numberOfColumns-j,numberOfRows);
			int[] diagonal = new int[numberOfElementsInDiagonal];
			for(int k=0; k<numberOfElementsInDiagonal;k++)
				diagonal[k] = values[k][k+j];
			if(isConsecutiveFour(diagonal))
				return true;
		}
		
		for(int j=3;j<numberOfColumns;j++){//判断副对角线左半部分是否有四个连续的数字
			int numberOfElementsInDiagonal = Math.min(j+1,numberOfRows);
			int[] diagonal = new int[numberOfElementsInDiagonal];
			for(int k=0;k<numberOfElementsInDiagonal;k++)
				diagonal[k] = values[k][j - k];
			if(isConsecutiveFour(diagonal))
		        return true;
		}
		
		
		for(int i=1;i<numberOfRows-3;i++){//判断副对角线右半部份是否有四个连续的数字
			int numberOfElementsInDiagonal = Math.min(numberOfRows-i,numberOfColumns);
			int[] diagonal = new int[numberOfElementsInDiagonal];
			for(int k=0;k<numberOfElementsInDiagonal;k++)
				diagonal[k] = values[k+i][numberOfColumns-k-1];
			if(isConsecutiveFour(diagonal))
		        return true;
		}
		return false;
	}
	
	//判断每一行元素中有没有四个连续的数字
	//方法重载
	public static boolean isConsecutiveFour(int[] values){
		for(int i=0;i<values.length-3;i++){
			boolean isEqual = true;
			for(int j=i;j<i+3;j++){
				if(values[j]!=values[j+1]){
					isEqual = false;
					break;
				}
			}
			if(isEqual)
				return true;
	    }
	    return false;
	}
	
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("Enter the number of row: ");
		int numOfR = input.nextInt();
		System.out.print("Enter the number of column: ");
		int numOfC = input.nextInt();
		System.out.println("Enter the array:");
		int[][] f = new int[numOfR][numOfC];
		for(int i=0;i<numOfR;i++){
			for(int j=0;j<numOfC;j++){
				f[i][j] = input.nextInt();
			}
		}
		System.out.println(isConsecutiveFour(f));
	}

}

被重载的方法必须具有不同的参数列表。不能基于不同修饰符或返回值类型来重载方法。

方法重载:方法名字一样,参数个数或者参数类型不同,函数的返回值类型不同不作为函数重载的标志。)


九宫格是一个9×9的网格,它分为更小的3×3的盒子,将从1到9的数字植入格子里,使每行、每列以及每个3×3盒子都包含1到9的数字。
import java.util.Arrays;
import java.util.Scanner;

public class Exercise8_24 {
	public static void main(String[] args){
		int[][] grid = readASolution();
		System.out.println(isValid(grid) ? "Valid solution":"Invalid solution");
	}

	

	private static int[][] readASolution() {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		System.out.println("Enter a Sudoku puzzle solution:");
		int[][] grid = new int[9][9];
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				grid[i][j] = input.nextInt();
			}
		}
		return grid;
	}
	
	
	private static boolean isValid(int[][] grid) {
		// TODO Auto-generated method stub
		for(int i=0;i<9;i++){//判断每一行是否具有数字1到9
			if(!is1To9(grid[i]))
				return false;
		}
		
		for(int j=0;j<9;j++){//判断每一列是否具有数字1到9
			int[] column = new int[9];
			for(int i=0;i<9;i++){
				column[i] = grid[i][j];
			}
			if(!is1To9(column))
				return false;
		}
		
		for(int i=0;i<3;i++){//判断每一个小的方盒是否具有数字1到9
			for(int j=0;j<3;j++){
				int k=0;
				int[] list = new int[9];
				for(int row = i*3;row<i*3+3;row++){
					for(int column = j*3;column<j*3+3;column++){
						list[k++] = grid[row][column];
					}
				}
				if(!is1To9(list))
					return false;
			}
		}
		return true;
	}



	private static boolean is1To9(int[] list) {
		// TODO Auto-generated method stub
		int[] temp = new int[list.length];
		//使用java.lang.System类中的静态方法arraycopy复制数组
		System.arraycopy(list, 0, temp, 0, list.length);
		Arrays.sort(temp);
		for(int i=0;i<9;i++){
			if(temp[i]!=i+1)
				return false;
		}
		return true;
	}
	
	

}

复制数组的方法

1.(java.lang.)System.arraycopy(sourceArray , src_pos , targetArray , tar_pos , length);

参数src_pos和tar_pos分别表示在源数组sourceArray和目标数组targetArray中的起始位置。从sourceArray复制到targetArray中的元素个数由参数length指定。

注意:arraycopy方法没有给目标数组分配内存空间。复制前必须创建目标数组以及分配给它的内存空间。复制完成后,sourceArray和targetArray具有相同的内容,但占有独立的内存空间。

2.Cloneable接口:实现Cloneable接口的类标记为可克隆的,而且它的对象可以使用在Object类中定义的clone()方法克隆;

Java库中的很多类(Data、Calendar、ArrayList)实现Cloneable。这样,这些类的实例可以被克隆。

使用clone方法克隆一个数组:

int[] list1 = {1,2};
int[] list2 = list1.clone();

3.使用循环语句逐个地复制数组元素




import java.util.Arrays;
import java.util.Scanner;

public class Exercise8_36 {
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("Enter number n: ");
		int n = input.nextInt();
		
		char[] letters = new char[n];//在字符数组letters里面按照字母顺序存储从A开始的n个字母
		for(int i=0;i<n;i++)
			letters[i] = (char)('A'+i);
		
		char[][] f = new char[n][n];
		System.out.println("Enter "+n+" rows of letters separated by spaces:");
		
		for(int i=0;i<n;i++){
			if(i==0){//nextLine():取到一个换行符前面的数据,所以一开始程序已经从控制台读入Enter...的字符串内容,长度为1
                //只能设置一个字符串s1将以上字符串读入不进行任何其他操作。
				String s1 = input.nextLine();
			}
			String s = input.nextLine();
			String[] items = s.split("[ .+]");//分割字符串
			if(items.length!=n){
				System.out.println("Wrong input: you need to enter exactly "+n+" letters");
				System.exit(1);//System.exit(status),status表示退出的状态码,非零表示异常终止
			}
			
			for(int j=0;j<items.length;j++){
				if(items[j].length()!=1){
					System.out.println("Wrong input: you need to enter single letters");
					System.exit(2);
				}
				f[i][j] = items[j].charAt(0);
			}
			
			char[] clonedRow = f[i].clone();//复制每一行到clonedRow数组里面
			Arrays.sort(clonedRow);
			if(!Arrays.equals(clonedRow, letters)){
				System.out.println("Wrong input: the letters must be from "+letters[0]+" to "+letters[letters.length-1] );
			}	
		}

		char[][] transposedMatrix = getTransposed(f);
		for(int i=0;i<f.length;i++){
			Arrays.sort(transposedMatrix[i]);
			if(!Arrays.equals(letters, transposedMatrix[i])){
				System.out.println("The input array is not a Latin square");
				System.exit(4);
			}
		}
		System.out.println("The input array is a Latin square");
	}

	private static char[][] getTransposed(char[][] f) {//将数组进行转置
		// TODO Auto-generated method stub
		char[][] result = new char[f.length][f.length];
		for(int j=0;j<f.length;j++){
			for(int i=0;i<f.length;i++){
				result[i][j] = f[j][i];
			}
		}
		return result;
	}

	 
}


nextLine()读取一行文本(按下回车键为结束标志),取到一个换行符前面的数据

next()读取一个字符串,该字符在一个空白符前结束,取到一个间隔符前面的数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值