private void search(int k) {
		if(k == 0) {
			results.clear();
			active = true;
		}
		if(k == max - known || (root.getLeft() == root && root.getRight() == root)) {
			active = false;
			for(Node n: results)
				out.add(new Node(n.getRow(), n.getRoot()));
			return;
		}
		Node col = root.getRight();
		cover(col);
		for(Node rowNode = col.getDown(); rowNode != col && active; rowNode = rowNode.getDown()) {
			results.add(rowNode);
			for(Node rightNode = rowNode.getRight(); rightNode != rowNode; rightNode = rightNode.getRight())
				cover(rightNode.getRoot());
			search(k + 1);
			for(Node rightNode = rowNode.getRight(); rightNode != rowNode; rightNode = rightNode.getRight())
				uncover(rightNode.getRoot());
			results.remove(rowNode);
		}
		uncover(col);
	}