题目:
某x*x矩阵有若干坐标,其中部分或全部坐标可用。
现规定任何两个坐标横竖方向都不能相邻,求此矩阵最大可用坐标数。
算法思路:
先将矩阵坐标图翻转(即横纵坐标对换)
找到第一个左右相邻坐标x(不看上下方):
如果找不到:
将此坐标图添加到坐标图集合List(这里只保留坐标数最大的坐标图)。
如果找到采取三种方法:
一种是去掉x右边的坐标,然后递归重复;
另一种是去掉x左边的坐标(如果右边有可用坐标的话也顺便去掉,然后递归重复;
最后一种是两个坐标都去掉,然后递归(经测试这条很有必要)。
将集合List中的所有坐标图逐个翻转(即横纵坐标对换),清空List,然后再来一遍找左右相邻坐标方法。
最后集合List中的所有坐标图就是答案
针对不可用坐标很少时的情况,加入米字型处理方法,即找到所有上左、上右、下左、下右和中间都可用的“米”字型坐标,先设置上下左右4个点为不可用,然后再执行上述算法。(感觉效果也不是很大)
具体代码如下:
import java.util.ArrayList;
import java.util.List;
public class ArrayAlgorithm {
private int maxPoins = 0;// 统计最大可用坐标数
private int minPoins = 0;// 最小可用坐标数
public static void main(String[] args) {
char[][] array = {
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' },
{
'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' } };
long start = System.currentTimeMillis();
new ArrayAlgorithm().nonAdjacent(array, 'o', 'x');
System.out.println("执行时间:" + (System.currentTimeMillis() - start));
}
public void nonAdjacent(char[][] array, char usable, char unusable) {
int col = array.length, row = 0;//array数组行列数
int maxRow = 0;//array数组最大行数
for (int i = 0; i < col; i++) {
row = array[i].length;
if (maxRow < row) {
maxRow = row;
}
}
char[][] copy = new char[col][maxRow];
for (int i = 0; i < col; i++) {
row = array[i].length;
for (int j = 0; j < maxRow; j++) {
if (j < row && array[i][j] == usable) {
copy[i][j] = usable;
} else {
copy[i][j] = unusable;
}
}
}
List<char[][]> list = new ArrayList<>();
nonAdjacent(list, copy, usable