该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有注释,测试运行一下就行了,大部分人还是能看懂的。
import java.util.Vector;
public class TestLock {
private LockPoint[][] lockPoints;
private final int TABLE_WIDTH = 3;
private final int PSW_LENGTH = 4;
private LockPoint[][] getLockPoints() {
if (lockPoints == null) {
lockPoints = new LockPoint[TABLE_WIDTH][TABLE_WIDTH];
for (int row = 0; row < TABLE_WIDTH; row++) {
for (int col = 0; col < TABLE_WIDTH; col++) {
lockPoints[row][col] = new LockPoint(row * TABLE_WIDTH
+ col + 1, row, col);
}
}
}
return lockPoints;
}
private boolean testCatch(LockPoint des, LockPoint src, LockPoint[][] points) {
if (des.isVisited()) {
return false;
}
if (src.getIndex() == des.getIndex()) {
return false;
}
int lineRow = src.getRow() + des.getRow();
int lineCol = src.getCol() + des.getCol();
if (lineCol % 2 == 0 && lineRow % 2 == 0) {
return points[lineRow / 2][lineCol / 2].isVisited();
}
return true;
}
public Vector dpFind() {
Vector roads = new Vector();
LockPoint lockPoint = null;
for (int row = 0; row < TABLE_WIDTH; row++) {
for (int col = 0; col < TABLE_WIDTH; col++) {
lockPoint = getLockPoints()[row][col];
doFind(getLockPoints(), lockPoint, "", roads);
}
}
return roads;
}
private int countSingle(int row, int col, int radio) {
Vector roads = new Vector();
LockPoint lockPoint = getLockPoints()[row][col];
doFind(getLockPoints(), lockPoint, "",
roads);
return roads.size() * radio;
}
public int dpFindCount() {
int count = 0;
count = countSingle(0, 0, 4);
count += countSingle(0, 1, 4);
count += countSingle(1, 1, 1);
return count;
}
private void doFind(LockPoint[][] points, LockPoint point, String road,
Vector roads) {
Vector vPoints = new Vector();
point.setVisited(true);
String tmpRoad = road + point.getIndex();
if (tmpRoad.length() >= PSW_LENGTH) {
roads.add(tmpRoad);
}
for (int iRow = 0; iRow < TABLE_WIDTH; iRow++) {
for (int iCol = 0; iCol < TABLE_WIDTH; iCol++) {
if (testCatch(points[iRow][iCol], point, points)) {
vPoints.add(points[iRow][iCol]);
}
}
}
LockPoint tmpPoint = null;
for (LockPoint vPoint : vPoints) {
tmpPoint = points[vPoint.getRow()][vPoint.getCol()];
doFind(points, tmpPoint, tmpRoad, roads);
}
point.setVisited(false);
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
TestLock testLock = new TestLock();
//Vector roads = testLock.dpFind();
//for(int i = 0; i< roads.size(); i++){
//System.out.println(roads.get(i));
//}
//System.out.println("========");
//System.out.println(roads.size());
System.out.println(testLock.dpFindCount());
System.out.printf("Use: %d ms", System.currentTimeMillis() - start);
}
}
class LockPoint {
private boolean visited;
private int index;
private int row;
private int col;
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
public LockPoint(int index, int row, int col) {
this.index = index;
this.row = row;
this.col = col;
}
public void copy(LockPoint point) {
if (point == null) {
return;
}
this.index = point.getIndex();
this.row = point.getRow();
this.col = point.getCol();
this.visited = point.isVisited();
}
public int getIndex() {
return index;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
}