题目大意:为了进行城市规划,需要计算一个住宅区的住宅数目。该住宅区的俯视图已经做好,并规划成一个n×m的网格,如果某个网格单元具有屋顶的一部分,则向其赋值1,否则赋值0,由值为1的相邻单元组成的簇认定为一个单独住宅。对角放置的值为1的网格不被十位同一住宅区。
输入:n×m的二维数组,n表示行,m表示列
输出:整数k表示住宅的总数目
import java.util.LinkedList;
import java.util.Queue;
public class T6 {
public static void main(String[] args)
{
int[][] map={{0,1,0,0},{0,1,0,0},{0,1,1,0},{1,0,0,1}};
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;
}
}
}
}