连连看的实现

1 篇文章 0 订阅

连连看的实现 一种蛮力方法

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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值