思路:
遍历数组然后计算当前点进行模糊操作之后的值,将这个值存入队列中。
因为队列是先进先出的特点所以不需要其他操作,最后按照顺序将原数组中的值替换掉即可。当然创建一个新的二维数组也可以。但是不能直接替换原数组的值,会影响到后面的数据。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class test9 {
/*
* 题目描述 小蓝有一张黑白图像,由 n ∗ m 个像素组成,其中从上到下共 n 行,每行从左到右 m列。每个像素由一个 0 到 255 之间的灰度值表示。
* 现在,小蓝准备对图像进行模糊操作,操作的方法为: 对于每个像素,将以它为中心 3 * 3 区域内的所有像素(可能是 9 个像素或少于 9
* 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。 请注意每个像素都要用原图中的灰度值计算求和。 输入格式
* 输入的第一行包含两个整数 n , m。 第 2 行到第 n + 1 行每行包含 m个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。 输出格式
* 输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。 样例输入
*
* 3 4
* 0 0 0 255
* 0 0 255 0
* 0 30 255 255
*
* 样例输出
*
* 0 42 85 127
* 5 60 116 170
* 7 90 132 191
*
* 数据规模和约定 对于所有评测用例,1 <= n, m <= 100。 扩展有8个方向扩展,然后以当前这个点为中心向 8
* 个方向扩展即可,最后按照题意求模糊值。
*/
static int[] dx= {-1,-1,0,1,1,1,0,-1};//定义当前点的8个位置
static int[] dy= {0,1,1,1,0,-1,-1,-1};
static int[][] data;
static Queue<Integer> q=new LinkedList<Integer>();//存储数据由于先进先出的特性所以不用做其他处理
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
data=new int[n][m];
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
data[i][j]=sc.nextInt();
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
op(i,j,data);
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
data[i][j]=q.poll();
}
}
for (int[] is : data) {
for (int i: is) {
System.out.print(i+" ");
}
System.out.println();
}
sc.close();
}
private static void op(int x, int y, int[][] data) {
int n=data.length;
int m=data[0].length;
int cnt=1,sum=data[x][y];//cnt统计合法区域内所有点的个数,sum表示所有点的和
for(int i=0;i<8;i++) {
int _x=x+dx[i];
int _y=y+dy[i];
if(_x>=0&&_x<n&&_y>=0&&_y<m) {
cnt++;
sum+=data[_x][_y];
}
}
q.add(sum/(cnt));
}
}