2020-03-08

庚子鼠年 己卯月 庚戌日

描述

今天把七牛云图床解决了,写博客的图片再也不用担心麻烦了

优化了一下项目

把前面写的设计模式构建思维导图

随笔

js与thymeleaf结合,js获取thymeleaf变量

<script th:inline="javascript">//一定要加上这句
[[${msg}]]

性能分析

package chang.性能测试;

import java.util.Scanner;


public class Main {

    public static int N;  //n*n矩阵,从0开始计数
    public static int M;  //1-m矩阵 m<=9 填的数据
    public static int[][] arr = new int[9][9];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt() - 1;
        M = N + 1;
        int k = sc.nextInt();

        for (int w = 0; w < k; w++) {
            for (int i = 0; i <= N; i++) {
                for (int j = 0; j <= N; j++) {
                    arr[i][j]  = sc.nextInt();
                }
            }
            dfs(0);
        }
    }

    public static void dfs(int cut) {
        int n = N + 1 ;
        if(cut==Math.pow(n, 2)) {
            print_arr();
            return;
        }
        //通过cut求出行与列(i,j)
        int i = cut / n;
        int j = cut % n;

        //已知条件以读入的数据
        if(arr[i][j] != 0) {
            dfs(cut + 1);
            return;
        }

        //arr填入1-M试探
        for(int t = 1;t <= M; t++) {
            if(isColAndRow(i,j,t)&&isGrid(i,j,t)) {
                arr[i][j] = t;
                dfs(cut + 1);
                //回溯
                arr[i][j] = 0;
            }
        }
    }

    /**
     * 打印出结果
     */
    public static void print_arr() {
        for(int i = 0 ;i <= N;i++ ) {
            for(int j = 0;j <= N;j++) {
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println();
        }
        System.out.println();
    }


    /**
     * i行j列填入k是否满足条件(仅判断行与列)
     * @param i 测试行
     * @param j 测试列
     * @param k 当前试探值
     * @return 是否满足条件
     */
    public static boolean isColAndRow(int i,int j,int k) {
        //列不变
        for(int p = 0;p <= N ;p++) {
            if(p!=i&&arr[p][j]==k) {
                return false;
            }
        }
        //行
        for(int p = 0;p <= N ;p++) {
            if(j!=p&&arr[i][p]==k) {
                return false;
            }
        }
        return true;
    }
    /**
     * 判断在当前块是否满足条件
     * @param i
     * @param j
     * @param k
     * @return
     */
    public static boolean isGrid(int i,int j,int k) {
        int n = N +1;
        if(105%n==0) {
            return true;
        }
        //方块的c行与r列
        int c = 0,r = 0;
        if(n%3==0) {
            c = 3;
            r = n/3;
        }else if(n%2==0) {
            c = 2;
            r = n/2;
        }

        //算出具体的格子大小
        c = n / c;
        r = n / r;
        //通过i,j知道在那一个方格中
        int in_c = (i/c)*c;
        int in_r = (j/r)*r;
        for(int p =in_c;p < in_c + c;p++) {
            for(int q = in_r;q < in_r + r;q++) {
                if(arr[p][q]==k) {
                    if(p==i&&q==j) {
                        continue;
                    }
                    return false;
                }
            }

        }
        return true;
    }

}

这个是上次作业的代码,拿来性能分析一下

浅拷贝

// 实现接口 Cloneable

@Override
	protected User clone() {
        return (User)super.clone();
	}

深拷贝

// 实现接口 Cloneable, Serializable	
//方法一:流方式
@Override
	protected User clone() {
		User cloneObj = null;
		try {
            //写入字节流
			//将对象写入流中
	        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
	        objectOutputStream.writeObject(this);
	        //从流中取出
	        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
	        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            cloneObj = (User) objectInputStream.readObject();
            outputStream.close();
            objectOutputStream.close();
            inputStream.close();
            objectInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
		return cloneObj;
//		return (User)super.clone();
	}

// 方法二
方式实现里面对象的clone方法,不推荐

提取工具类

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
/**
 * 通过字节流序列化实现深拷贝,需要深拷贝的对象必须实现Serializable接口
 * 
 * @author Administrator
 */
public class CloneUtils {
	@SuppressWarnings("unchecked")
	public static <T extends Serializable> T clone(T obj) {
		T cloneObj = null;
		try {
			// 写入字节流
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ObjectOutputStream obs = new ObjectOutputStream(out);
			obs.writeObject(obj);
			obs.close();
 
			// 分配内存,写入原始对象,生成新对象
			ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(ios);
			// 返回生成的新对象
			cloneObj = (T) ois.readObject();
			ois.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cloneObj;
	}
}
posted @ 2020-03-08 21:41  chang1024  阅读(173)  评论(0编辑  收藏  举报