第九题

思路:
遍历数组然后计算当前点进行模糊操作之后的值,将这个值存入队列中。
因为队列是先进先出的特点所以不需要其他操作,最后按照顺序将原数组中的值替换掉即可。当然创建一个新的二维数组也可以。但是不能直接替换原数组的值,会影响到后面的数据。

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));
}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值