您的位置:首页 > 其它

百度笔试-房屋群

2016-09-20 19:33 399 查看
         为了进行城市规划,需要计算一个住宅区的住宅数目。该住宅区的俯视图已经做好,并规划成一个n×m的网格,如果某个网格单元具有屋顶的一部分,则向其赋值1,否则赋值0,由值为1的相邻单元组成的簇认定为一个单独住宅。对角放置的值为1的网格不被视为同一住宅区。

        输入:n×m的二维数组,n表示行,m表示列

        输出:整数k表示住宅的总数目

import java.util.Queue;

public class 百度笔试_房屋群 {
public static void main(String[] args)
{
int[][] map={{0,0,0,0,0},{0,1,1,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,0,0}};
System.out.println(solve(map));
}
static int solve(int[][] grid)
{
int cnt=0;
int row=grid.length;
int col=grid[0].length;
used=new int[row][col];
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(grid[i][j]==1 && used[i][j]==0)
{
bfs(grid,i,j,row,col);
cnt++;
}
}
}
return cnt;
}
static class Node{
int x;int y;
public Node(int x,int y) {
this.x=x;
this.y=y;
}
}
static int[][] used;
static int[][] d={{1,0},{-1,0},{0,1},{0,-1}};
static void bfs(int[][] map,int x,int y,int n,int m)
{
Queue<Node> q=new LinkedList<>();
Node first=new Node(x, y);
q.add(first);
used[x][y]=1;
while(!q.isEmpty())
{

Node head=q.poll();
int xx=head.x;
int yy=head.y;
for(int i=0;i<4;i++)
{
int px=xx+d[i][0];
int py=yy+d[i][1];
if(px<0 || px>=n || py<0 || py>=m || used[px][py]==1 || map[px][py]==0)
continue;
q.add(new Node(px, py));
used[px][py]=1;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: