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;
}
}