矩阵基础算法——计算平面矩阵内任何两个坐标不相邻的最大坐标数的算法

该博客探讨了如何在给定的矩阵中,根据不能相邻的规则找出最大可用坐标数的算法。首先对矩阵进行坐标翻转,然后通过递归处理左右相邻坐标,去除它们并继续搜索。经过两次坐标翻转和遍历,得出最大可用坐标的集合。示例中,8x8矩阵的运行结果显示了算法的应用。
摘要由CSDN通过智能技术生成

矩阵基础算法——计算平面矩阵内任何两个坐标不相邻的最大坐标数的算法一

题目:

某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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值