标签:最大数 area int 矩阵 寻找 ele queue ++ Data
题目:
给一个矩阵数组,0表示海洋,1表示陆地,上下左右都是1表示连通的一块陆地,斜对角的不算。
求陆地最大面积。
如:
{0,1,1,0,1,0,0}, {1,0,0,1,1,1,0}, {1,1,0,0,1,1,0}, {0,1,1,0,0,1,1}
有3块陆地,面积分别是:2,8,4
最大陆地面积为:8
package xxxx;
import java.util.LinkedList;
import java.util.Queue;
/**
* create by ziqiiii
*/
public class Test {
static public void main(String[] args) {
int[][] area = {
{0,1,1,0,1,0,0},
{1,0,0,1,1,1,0},
{1,1,0,0,1,1,0},
{0,1,1,0,0,1,1}
};
System.out.println(findAreaMax(area)); // 8
int[][] area2 = {
{0,1,1,0,1,0,0},
{1,0,0,1,0,1,0},
{1,1,0,0,1,1,0},
{0,1,1,0,0,1,1}
};
System.out.println(findAreaMax(area2)); //5
int[][] area3 = {{}};
System.out.println(findAreaMax(area3)); //0
int[][] area4 = {
{1,0,1,0},
{1,1,1,0},
{0,0,1,1},
{1,0,1,0},
{1,1,1,1}
};
System.out.println(findAreaMax(area4));//13
}
public static class Data{ //保存地址下标
int i;
int j;
Data(int i, int j){
this.i = i;
this.j = j;
}
}
public static int findAreaMax(int[][] area){
int row = area.length;
if(row == 0){
return 0;
}
int col = area[0].length;
if(col == 0){
return 0;
}
int[][] v = new int[row][col]; //v数组记录该地址是否已经被访问。不初始化,默认是0
// for(int i = 0; i < row; i++) {
// for (int j = 0; j < col; j++) {
// v[i][j] = 0;
// }
// }
int resMax = 0;//保存最大面积
for(int i = 0; i < row; i++){
for(int j = 0; j< col; j++){ //遍历整个矩阵
if(v[i][j] == 0){ //没有访问过
v[i][j] = 1; //则访问该点
if(area[i][j] == 1){
Queue<Data> queue = new LinkedList<>(); //(LinkedList实现了队列接口。)队列,进行广度优先搜索
queue.offer(new Data(i,j)); //地址入队
int sum = 1;//当前访问面积为1
while(!queue.isEmpty()){
Data ele = queue.poll(); //地址出队
//向上,(可以向上,没有被访问过,且为陆地)
if(ele.i >= 1 && v[ele.i - 1][ele.j] != 1 && area[ele.i - 1][ele.j] == 1){
v[ele.i - 1][ele.j] = 1;
sum++;
queue.offer(new Data(ele.i - 1,ele.j));
}
//向右
if(ele.j <= col - 2 && v[ele.i][ele.j + 1] != 1 && area[ele.i][ele.j + 1] == 1){
v[ele.i][ele.j + 1] = 1;
sum++;
queue.offer(new Data(ele.i, ele.j + 1));
}
//向下
if(ele.i <= row - 2 && v[ele.i + 1][ele.j] != 1 && area[ele.i + 1][ele.j] == 1){
v[ele.i + 1][ele.j] = 1;
sum++;
queue.offer(new Data(ele.i + 1, ele.j));
}
//向左
if(ele.j >= 1 && v[ele.i][ele.j - 1] != 1 && area[ele.i][ele.j - 1] == 1){
v[ele.i][ele.j - 1] = 1;
sum++;
queue.offer(new Data(ele.i, ele.j - 1));
}
}
if(sum > resMax){
resMax = sum;//【当前访问陆地】大于【当前最大陆地】,更新
}
}
}
}
}
return resMax;
}
}
标签:最大数,area,int,矩阵,寻找,ele,queue,++,Data 来源: https://blog.csdn.net/qq_20417499/article/details/100166375
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。