二维数组矩阵闭环数字的替换问题
2016-05-10 19:52
531 查看
如下,存在矩阵形如:
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。
解决思路如图:
最终代码:
运行结果:
仍然存在的问题:
(1)没有判断多个圆环的情况。
(2)如果有一个圆环,但同时也有其他未闭合的环,那么久不能愉快的玩耍了。。。
也就是复杂一点的就不对头了……
增加条件继续判断或许可行。
思路是分几次筛选,第一次遍历数组,如果某个位置的值为0并且上下左右都存在一个1(循环遍历一行和一列),替换为2。第一次筛选后可能仍然不合理,无法应对未闭合的情况。第二次筛选则对为闭合的进行处理:第一筛选时确保值为2的位置前后上下被1包围,遍历数组,当值为2时,其到离他最近的1是否存在0,只要某个值为2的地方存在这种情况,圆环就一定未闭合。
问题来自:http://bbs.csdn.net/topics/391948572?page=1#post-401127140
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
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树