问题描述:
渗透问题,给一个n*m的矩阵,0为空白,1为白纸,2为墨水,墨水每经过每一秒会将上下左右相邻的白纸染成黑色,然后继续渗透,判断此图中的白纸最终是否能够全部被墨水染上色,若能需要输出所有白纸全部被墨水染上色的时间。
java代码实现:
package com.example.demo.controller;
import java.util.ArrayList;
import java.util.List;
public class Test5Controller {
//上下左右四个方向的增量
static int move[][]=new int[][] {{0,0},{0,1},{1,0},{0,-1},{-1,0}};
static int t[][]=new int[][] {
{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,0,0,0,0,0},
{0,1,2,1,1,1,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,2},
{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}};
public static void main(String[] args) {
List<Node> li=new ArrayList<>();
//先将开始时所有的墨水放入集合
for(int i=0;i<t.length;i++) {
for(int j=0;j<t[i].length;j++) {
if(t[i][j]==2) {
li.add(new Node(i,j,2));
}
}
}
//总时间c
int c=0;
do {
li=search(li);
if(li.size()>0) {
//如果集合里面有数据,那就向外扩散一次
c++;
}else {
break;
}
}while(true);
/**
* 看是否所有的纸都被染色
*/
for(int i=0;i<t.length;i++) {
for(int j=0;j<t[i].length;j++) {
if(t[i][j]==1) {
System.out.println("false");
return;
}
}
}
System.out.println("time:"+c);
}
public static List<Node> search(List<Node> list){
List<Node> li=new ArrayList<>();
/**
* 遍历每个周围节点
*/
for(Node n:list) {
/**
* 遍历每个节点的四个方向
*/
for(int i=1;i<=4;i++) {
int x=n.x+move[i][0];
int y=n.y+move[i][1];
//控制边界
if(x<t.length&&y<t[0].length&&t[x][y]==1) {
t[x][y]=2;
li.add(new Node(x,y,t[x][y]));
}
}
}
return li;
}
/**
* 模拟节点类
*/
static class Node{
public int x;//数组横坐标
public int y;//数组纵坐标
public int d;//数据
public Node(int x, int y, int d) {
super();
this.x = x;
this.y = y;
this.d = d;
}
@Override
public String toString() {
return "Node [x=" + x + ", y=" + y + ", d=" + d + "]";
}
}
}