android 解锁图案错误次数多 老人,关于Android手机图案解锁总密码数,个人写的一个递归版求解...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

没有注释,测试运行一下就行了,大部分人还是能看懂的。

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;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值