解决二维数组矩阵闭环数字的替换

如下,存在矩阵形如:

0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0

0 1 0 1 1 0 0 0 0 9 0 0 0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0

0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

其中1将0包围成一个闭合的环,要求将改环中的0替换成2。

解决思路如图:

最终代码:

package date0510.pm.数组闭环替换;

import java.util.ArrayList;
import java.util.List;

public class ResplaceNum {
    private static final int ARRAY[][] = {
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
            {0, 1, 0, 1, 1, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
            {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
            {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
            {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
            {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
            {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
            {0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
            {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    };
    private static int biNum;

    public static void main(String[] args) {
        StringBuffer nc = new StringBuffer();
        int[][] nums = ARRAY.clone();//比较复杂的逻辑,防止数据出错不能挽回

        System.out.println("矩阵初始:\n");
        //初始矩阵打印
        printlnArrays(nums);

        for (int i = 0; i < nums.length; i++) {
            int[] hang = nums[i];

            for (int j = 0; j < hang.length; j++) {
                int ge = hang[j];
                boolean topFlag = false;
                boolean buttomFlag = false;
                boolean leftFlag = false;
                boolean rightFlag = false;

                if (ge == 0) {
                    //判断上下方
                    for (int k = 0; k < nums.length; k++) {
                        if(nums[k][j] == 1 ){
                            if (k < i ) {
                                topFlag = true;
                            }else if (k > i) {
                                buttomFlag = true;
                            }
                        }
                    }
                    //判断前后方
                    for (int l = 0;  l < hang.length; l++) {
                        if (nums[i][l] == 1) {
                            if (l<j) {
                                leftFlag = true;
                            }else if (l>j) {
                                rightFlag = true;
                            }
                        }
                    }

                    if (leftFlag && rightFlag && topFlag && buttomFlag) {
                        hang[j] = 2;

                    }

                }

            }

        }

        /*
         * 第一次筛选完毕,输出数组
         */
        System.out.println("第一次筛选结果:\n");
        printlnArrays(nums);

        /*
         * 开始第二次筛选
         */

        boolean beihighFlag = true;
        boolean frontFlag = true;
        for (int j = 0; j < nums.length; j++) {
            int[] hang = nums[j];
            for (int k = 0; k < hang.length; k++) {
                int ge = hang[k];

                if (ge == 2) {
                    //遍历该行,右边离1最近部分存在0,说明没有闭合
                    for (int l = k; l < hang.length; l++) {
                        int ls = hang[l];
                        if (ls == 0) {
                            beihighFlag = false;
                            break;
                        }
                        if (ls == 1) {
                            break;
                        }
                    }
                    //遍历该行,左边离1最近部分存在0,也说明没有闭合
                    for (int l = k; l > 0; l--) {
                        int ls= hang[l];
                        if (ls == 0) {
                            frontFlag = false;
                            break;
                        }
                        if (ls == 1) {
                            break;
                        }

                    }

                }

            }
        }

        System.out.println("筛选结果:\n");
        if (frontFlag == false || beihighFlag == false) {
            System.out.println("可能至少存在一个环未闭合");
            //此处应该遍历数组,将所有改成2的值变回来——0,因使用了数组克隆,所以偷懒了
            return;
        }
            printlnArrays(nums);
        }

    private static void printlnArrays(int[][] nums){
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < nums.length; i++) {
            int[] hang = nums[i];
            for (int j = 0; j < hang.length; j++) {
                int ge = hang[j];
                if (ge == 2) {//改动输出,将2变成,以便更醒目

                    sb.append("② ");
                }
                else {
                    sb.append(ge+" ");
                }
            }
            sb.append("\n");
        }
        System.out.println(sb);

    }
}

运行结果:

仍然存在的问题:

(1)没有判断多个圆环的情况。

(2)如果有一个圆环,但同时也有其他未闭合的环,那么久不能愉快的玩耍了。。。

也就是复杂一点的就不对头了……

增加条件继续判断或许可行。

思路是分几次筛选,第一次遍历数组,如果某个位置的值为0并且上下左右都存在一个1(循环遍历一行和一列),替换为2。第一次筛选后可能仍然不合理,无法应对未闭合的情况。第二次筛选则对为闭合的进行处理:第一筛选时确保值为2的位置前后上下被1包围,遍历数组,当值为2时,其到离他最近的1是否存在0,只要某个值为2的地方存在这种情况,圆环就一定未闭合。

问题来自:http://bbs.csdn.net/topics/391948572?page=1#post-401127140

时间: 2024-11-05 18:45:32

解决二维数组矩阵闭环数字的替换的相关文章

【刷题】二维数组中找数字

一.描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的排序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.解题思路 关键:从数组的最右上方的数开始判断,根据该数与指定整数的大小进行下一步的比较. 三.代码 根据思路可以得到如下的代码 public class FindInPartiallySortedMatrix { public static void main(String[] args) { int[][] mat

解决二维数组转为ArrayList集合问题

2015年4月9日 天气冷 起初我参考的代码如下: 修改前代码块 String[][] str = { { "语文", "100" }, { "英语", "90" }, { "数学", "90" }, }; ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < str.le

面试题1: 二维数组中查找

本题出自<剑指offer 名企面试官精讲典型编程题>面试题3. 题目3:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序.请完成一个函数,输入一个这样的二维数组和整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行每列递增排序.如果在数组中查询7,则返回true:如果查找数字14,由于数组中不包含14,则返回false. 解决方法分析: 首先我们选取二维数组左下角的数字8,由于8大于7,并且8还是第四行的第一个数,因此数字7不可能出现在8所在的行,

剑指Offer面试题:2.二维数组中的查找

一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,由于数组不含有该数字,则返回false. 二.解题思路 首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查

一维数组和二维数组传出函数

#define LOCAL #include<cstdio> #include<cstdlib> #include<iostream> using namespace std; typedef int ElemType; const int maxSize=10; //传入函数的一维数组经过函数之后数组元素发生变化 int REV(int *a,int x,int y) { int i=x,j=y; while(i<j) { int temp=a[i]; a[i]

计算机二级-C语言-对标志位的巧妙使用。对二维数组数据进行处理。对文件进行数据输入。

//函数fun的功能是:计算形参x所指数组中平均值(规定所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于的移至后部,平均值作为返回值,在主函数中输出平均值和后移的数据. //重难点:对数组的处理. 1 #include <stdlib.h> 2 #include <stdio.h> 3 #define N 10 4 double fun(double *x) 5 { int i, j; double s, av, y[N]; 6 s=0; 7 for(i=0;

剑指 Offer——1. 二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解法一 利用二位数组有序的特性,首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每

二维数组的查找——剑指offer第一题

题目描述: 在一个二维数组中(每个一维数组的长度相同), 每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 设计思路: 遍历所有行 遍历行中的每个元素 判断元素值是否与给定的target值相等 相等返回True 判断元素是否大于给定target值(比target值大的话跳出循环) 遍历完没有返回false 代码: 1 import numpy as np 2 class Solution: 3

php 替换二维数组的 key

php 替换二维数组中的 key // 需要替换 key 的数组 $arr_old = array( '0' => array('id' => 1, 'name' => 'Carroll'), '1' => array('id' => 2, 'name' => 'Chrdai'), '3' => array('id' => 3, 'name' => 'xiaodai'), ); // 将新的key定义一个新数组 $key_name = array('k