给定一个N行乘N列的2D数组,逐行扫描该值并打印出所有局部峰值,该值大于其左上、上、右上、左、右、左下、下、右下的值(如果有)。
N的范围是2到150。
输入格式:
多组输入。每组输入包含两部分:
第一行包含整数N,表示2D数组的大小。
后面的N行中的每一行包含N个非负整数,用空格分隔。
输出格式:
对于每组输入,输出所有局部峰值按行顺序排列,每个局部峰值后跟一个空格。
如果没有局部峰值,则输出“none”。
每组输出之后加换行符。
输入样例:
2 5 1 1 0 2 5 2 2 3 3 5 5 5 0 5 0 5 5 5 3 1 2 5 2 3 2 4 2 3
输出样例:
5 5 none 5 4
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt())
{
int n = scanner.nextInt();
int[][] a = new int[n+2][n+2];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j] = scanner.nextInt();
for(int i=0;i<=n+1;i++) a[i][0] = -1;
for(int i=0;i<=n+1;i++) a[i][n+1] = -1;
for(int i=0;i<=n+1;i++) a[0][i] = -1;
for(int i=0;i<=n+1;i++) a[n+1][i] = -1;
int cnt = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i-1][j-1]&&a[i][j]>a[i-1][j]&&a[i][j]>a[i-1][j+1]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j-1]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j+1])
{
System.out.printf("%d ",a[i][j]);
cnt++;
}
}
}
if(cnt==0) System.out.printf("none\n");
else System.out.printf("\n");
}
}
}