连连看的实现 一种蛮力方法
0折一条直线可以消除的
1折两条直线可以消除的
2折三条直线可以消除的
如下图
public class LianLianKan {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a = /*{
{1 , 0 , 0, 0, 1 , 11},
{2 , 0 , 0, 12,13, 14},
{3 , 0 , 0, 0 ,15, 16},
{17, 18, 0, 0 , 0, 3 },
{19, 20, 2, 21, 22,23}
};*/
{
{1, 0, 0, 1},
{0, 0, 3, 4},
{5, 0, 6, 7},
{0, 1, 8, 0}
};
//lianliankan(a);
System.out.println("----------------------------");
//lianliankan(a, 1, 0);
lianliankan(a, 0, 0);
}
/*
* 向左搜索
* @param: a 数组
* @param: r 行
* @param: c 列
* @param: target 目标
* @param: p 找到的匹配点位置
* */
public static boolean left(int[][] a, int r, int c, int target, Point p){
if(a == null) return false;
while(c >= 0){
if(a[r][c] != 0){
if(a[r][c] == target) {
p.column = c;
return true;
}
return false;
}
c--;
}
return false;
}
/*
* 向右搜索
* @param: a 数组
* @param: r 行
* @param: c 列
* @param: target 目标
* @param: p 找到的匹配点位置
* */
public static boolean right(int[][] a, int r, int c, int target, Point p){
if(a == null) return false;
int n = a[0].length;
while(c < n){
if(a[r][c] != 0){
if(a[r][c] == target){
p.column = c;
return true;
}
return false;
}
c++;
}
return false;
}
/*
* 向上搜索
* @param: a 数组
* @param: r 行
* @param: c 列
* @param: target 目标
* @param: p 找到的匹配点位置
* */
public static boolean up(int[][] a, int r, int c, int target, Point p){
if(a == null) return false;
while(r >= 0){
if(a[r][c] != 0){
if(a[r][c] == target) {
p.row = r;
return true;
}
return false;
}
r--;
}
return false;
}
/*
* 向下搜索
* @param: a 数组
* @param: r 行
* @param: c 列
* @param: target 目标
* @param: p 找到的匹配点位置
* */
public static boolean down(int[][] a, int r, int c, int target, Point p){
if(a == null) return false;
int m = a.length;
while(r < m){
if(a[r][c] != 0){
if(a[r][c] == target) {
p.row = r;
return true;
}
return false;
}
r++;
}
return false;
}
/*
* 0折 要一条直线可以消除的
* @param: a 数组0表示空可以穿过
* @param: r 数组行
* @param: c 数组列
* @param: target 目标值
* @param: direction 搜索方向 1横向 2竖向 3横竖两向
* 出错则返回(-1,-1)否则返回找到的下标
* */
public static Point searchInOneLine(int[][] a, int r, int c, int target, int direction){
int targetRow = r;
int targetColumn = c;
Point p = new Point(targetRow, targetColumn);
if(direction == 3 || direction == 1){
//向左
if(left(a, r, c - 1, target, p)){
return p;
}
//向右
if(right(a, r, c + 1, target, p)){
return p;
}
}
if(direction == 3 || direction == 2){
//向上
if(up(a, r - 1, c, target, p)){
return p;
}
//向下
if(down(a, r + 1, c, target, p)){
return p;
}
}
return new Point(-1, -1);
}
/*
* 1折 要二条直线可以消除的
* @param: a 数组0表示空可以穿过
* @param: r 数组行
* @param: c 数组列
* @param: target 目标值
* @param: direction 搜索方向 1横向 2竖向 3横竖两向
* 出错则返回(-1,-1)否则返回找到的下标
* */
public static Point searchInTwoLines(int[][] a, int r, int c, int target, int direction){
int targetRow = r;
int targetColumn = c;
Point p = new Point(targetRow, targetColumn);
int m = a.length;
int n = a[0].length;
if(direction == 3 || direction == 1){
//向左
int cc = c;
while(cc > 0){
if(a[r][--cc] != 0) break;
Point tp = searchInOneLine(a, r, cc, target, 2);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
//向右
cc = c;
while(cc < n){
cc++;
if(cc >= n || a[r][cc] != 0) break;
Point tp = searchInOneLine(a, r, cc, target, 2);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
}
if(direction == 3 || direction == 2){
//向上
int rr = r;
while(rr > 0){
if(a[--rr][c] != 0) break;
Point tp = searchInOneLine(a, rr, c, target, 1);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
//向下
rr = r;
while(rr < m){
rr++;
if(rr >=m || a[rr][c] != 0) break;
Point tp = searchInOneLine(a, rr, c, target, 1);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
}
return new Point(-1, -1);
}
/*
* 2折 要三条直线可以消除的
* @param: a 数组0表示空可以穿过
* @param: r 数组行
* @param: c 数组列
* @param: target 目标值
* @param: direction 搜索方向 1横向 2竖向 3横竖两向
* 出错则返回(-1,-1)否则返回找到的下标
* */
public static Point searchInThreeLines(int[][] a, int r, int c, int target, int direction){
int targetRow = r;
int targetColumn = c;
Point p = new Point(targetRow, targetColumn);
int m = a.length;
int n = a[0].length;
//向左
int cc = c;
while(cc > 0){
if(a[r][--cc] != 0) break;
Point tp = searchInTwoLines(a, r, cc, target, 2);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
//向右
cc = c;
while(cc < n){
cc++;
if(cc >= n || a[r][cc] != 0) break;
Point tp = searchInTwoLines(a, r, cc, target, 2);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
//向上
int rr = r;
while(rr > 0){
if(a[--rr][c] != 0) break;
Point tp = searchInTwoLines(a, rr, c, target, 1);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
rr = r;
while(rr < m){
rr++;
if(rr >= m || a[rr][c] != 0) break;
Point tp = searchInTwoLines(a, rr, c, target, 1);
if(tp.row != -1 && tp.column != -1){
return tp;
}
}
return new Point(-1, -1);
}
/*
*@param: a数组、
*/
public static void lianliankan(int[][] a){
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a[i].length; j++){
if(a[i][j] == 0) continue;
Point p;
p = searchInOneLine(a, i, j, a[i][j], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + i + "," + j + ") -- " + "(" + p.row + "," + p.column + ")");
}
System.out.println("1");
p = searchInTwoLines(a, i, j, a[i][j], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + i + "," + j + ") -- " + "(" + p.row + "," + p.column + ")");
}
System.out.println("2");
p = searchInThreeLines(a, i, j, a[i][j], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + i + "," + j + ") -- " + "(" + p.row + "," + p.column + ")");
}
System.out.println("3");
}
}
}
/*
*@param: a数组、
*@param: r数组行
*@param: c数组列
*/
public static void lianliankan(int[][]a, int r, int c){
Point p;
p = searchInOneLine(a, r, c, a[r][c], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + r + "," + c + ") -- " + "(" + p.row + "," + p.column + ")");
System.out.println("1");
}
p = searchInTwoLines(a, r, c, a[r][c], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + r + "," + c + ") -- " + "(" + p.row + "," + p.column + ")");
System.out.println("2");
}
p = searchInThreeLines(a, r, c, a[r][c], 3);
if(p.row != -1 && p.column != -1){
System.out.println("(" + r + "," + c + ") -- " + "(" + p.row + "," + p.column + ")");
System.out.println("3");
}
}
}
class Point{
public int row;
public int column;
public Point(){
row = -1;
column = -1;
}
public Point(int r, int c){
row = r;
column = c;
}
}