private void expandCluster(){
		ArrayList<ArrayList<Integer>> queue = new ArrayList<ArrayList<Integer>>();
		// add all in gridLabel to the queue
		for (ArrayList<Integer> key : gridLabel.keySet()) {
			queue.add(key);
		}
		
		while ( queue.size() > 0 ) {
			ArrayList<Integer> cell = queue.remove(0);
			
			// all neighbors should have this cluster Id
			int clusterId = gridLabel.get(cell);
			
			// search for all neighboring cells
			ArrayList<ArrayList<Integer>> neighbors = Util.get8Neigbor(cell);
			for (ArrayList<Integer> n : neighbors) {
				
				// check if the cell is valud
				if ( ! isValidCell(n) ) continue;
				
				// if has not been marked yet
				if (! gridLabel.containsKey(n)) {
					gridLabel.put(n, clusterId);
					queue.add(n);
				}
			}
		}
		
	}