/**
* 搜索,返回最优点。
*
* @return
*/
public Point search(int x, int y) {
return LianlianKan.twoCornerSearch(imageCodes, x, y);
}
/**
* 连连看搜索算法。
*
* @author Geek_Soledad
*/
public static class LianlianKan {
/**
* 水平搜索
*
* @param datas
* 数组
* @param row
* 对比数值所在的行
* @param col
* 对比数值所在的列
* @param atRow
* 进行水平搜索时所在的行
* @return
*/
private static Point moveHorizon(int[][] datas, int row, int col, int atRow, int atCol) {
// 再拐左
for (int k = atCol - 1; k >= 1; k--) {
if (datas[atRow][k] == datas[row][col]) {
return new Point(atRow, k);
} else if (datas[atRow][k] != 0) {
break;
}
}
// 再拐右
for (int k = atCol + 1; k
if (datas[atRow][k] == datas[row][col]) {
return new Point(atRow, k);
} else if (datas[atRow][k] != 0) {
break;
}
}
return null;
}
/**
* 竖直搜索
*
* @param datas
* 数组
* @param row
* 对比数值所在的行
* @param col
* 对比数值所在的列
* @param atCol
* 进行水平搜索时所在的列
* @return
*/
private static Point movePortrait(int[][] datas, int row, int col, int atRow, int atCol) {
// 再拐上
for (int k = atCol - 1; k >= 1; k--) {
if (datas[k][atCol] == datas[row][col]) {
return new Point(k, atCol);
} else if (datas[k][atCol] != 0) {
break;
}
}
// 再拐下
for (int k = atCol + 1; k
if (datas[k][atCol] == datas[row][col]) {
return new Point(k, atCol);
} else if (datas[k][atCol] != 0) {
break;
}
}
return null;
}
/**
* 两个角搜索
*
* @param datas
* 数组
* @param x
* 纵坐标
* @param y
* 横坐标
* @return
*/
public static Point twoCornerSearch(int[][] datas, int x, int y) {
// 向左进行搜索
for (int i = y - 1; i >= 0; i--) {
// 向左进行直线搜索
if (datas[x][i] == datas[x][y]) {
return new Point(x, i);
} else if (datas[x][i] != 0) {
break;
}
// 向左,然后拐上进行直角搜索
for (int j = x - 1; j >= 0; j--) {
if (datas[j][i] == datas[x][y]) {
return new Point(j, i);
} else if (datas[j][i] != 0) {
break;
}
// 向左,拐上,再水平搜索
Point point = moveHorizon(datas, x, y, j, i);
if (point != null) {
return point;
}
}
// 向左,然后拐下进行直角搜索
for (int j = x + 1; j
if (datas[j][i] == datas[x][y]) {
return new Point(j, i);
} else if (datas[j][i] != 0) {
break;
}
// 向左,拐下,再水平搜索
Point point = moveHorizon(datas, x, y, j, i);
if (point != null) {
return point;
}
}
}
// 横向往右搜索
for (int i = y + 1, length = CODE_COL; i
// 向右直线搜索
if (datas[x][i] == datas[x][y]) {
return new Point(x, i);
} else if (datas[x][i] != 0) {
break;
}
// 向右,然后拐上进行直角搜索。
for (int j = x - 1; j >= 0; j--) {
if (datas[j][i] == datas[x][y]) {
return new Point(j, i);
} else if (datas[j][i] != 0) {
break;
}
// 向右,拐上,再水平搜索
Point point = moveHorizon(datas, x, y, j, i);
if (point != null) {
return point;
}
}
// 向右,然后拐下进行直角搜索
for (int j = x + 1; j
if (datas[j][i] == datas[x][y]) {
return new Point(j, i);
} else if (datas[j][i] != 0) {
break;
}
// 向右,拐下,再水平搜索。
Point point = moveHorizon(datas, x, y, j, i);
if (point != null) {
return point;
}
}
}
// 纵向往上搜索
for (int i = x - 1; i >= 0; i--) {
if (datas[i][y] == datas[x][y]) {
return new Point(i, y);
} else if (datas[i][y] != 0) {
break;
}
// 向上,然后拐左进行直角搜索。
for (int j = y - 1; j >= 0; j--) {
if (datas[i][j] == datas[x][y]) {
return new Point(i, j);
} else if (datas[i][j] != 0) {
break;
}
// 向上,拐左,再竖直搜索
Point point = movePortrait(datas, x, y, i, j);
if (point != null) {
return point;
}
}
// 向上,然后拐右进行直角搜索
for (int j = y + 1; j
if (datas[i][j] == datas[x][y]) {
return new Point(i, j);
} else if (datas[i][j] != 0) {
break;
}
// 向上,拐右,再竖直搜索
Point point = movePortrait(datas, x, y, i, j);
if (point != null) {
return point;
}
}
}
// 纵向往下搜索
for (int i = x + 1, length = CODE_ROW; i
if (datas[i][y] == datas[x][y]) {
return new Point(i, y);
} else if (datas[i][y] != 0) {
break;
}
// 向下,然后拐左进行直角搜索。
for (int j = y - 1; j >= 0; j--) {
if (datas[i][j] == datas[x][y]) {
return new Point(i, j);
} else if (datas[i][j] != 0) {
break;
}
// 向下,拐右,再竖直搜索
Point point = movePortrait(datas, x, y, i, j);
if (point != null) {
return point;
}
}
// 向下,然后拐右进行直角搜索
for (int j = y + 1; j
if (datas[i][j] == datas[x][y]) {
return new Point(i, j);
} else if (datas[i][j] != 0) {
break;
}
// 向下,拐右,再竖直搜索
Point point = movePortrait(datas, x, y, i, j);
if (point != null) {
return point;
}
}
}
return null;
}
}