一、题目
题目链接:ccf官网
二、题解(Java版)
做了好几道第三题这种模拟大题,第一次在不看其他人题解的情况下拿到满分,好激动啊啊啊啊
import java.util.Scanner;
public class Main {
static int[][] Q = new int[8][8];
static int[][] M = new int[8][8]; // 对M1进行操作,M存原始数据,M1是结果
static double[][] M1 = new double[8][8];
// 离散变换
static void liSan(int i, int j) {
double mij = 0L;
for (int u = 0; u < 8; u++) {
for (int v = 0; v < 8; v++) {
double temp = M[u][v] * Math.cos(Math.PI / 8 * u * (i + 0.5))
* Math.cos(Math.PI / 8 * v * (j + 0.5));
if (u == 0 && v == 0) {
mij += 0.5 * temp;
} else if ((u != 0 && v == 0) || (u == 0 && v != 0)) {
mij += Math.sqrt(0.5) * temp;
} else {
mij += 1.0 * temp;
}
}
}
mij /= 4;
M1[i][j] = mij;
}
static void four() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
M[i][j] *= Q[i][j];
M1[i][j] = M[i][j]; //M复制到M1
}
}
}
static void five() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
liSan(i, j);
}
}
}
static void six() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
M1[i][j] += 128;
if (M1[i][j] % 1 >= 0.5) {
M[i][j] = (int) (M1[i][j] + 0.5);
if (M[i][j] > 255) {
M[i][j] = 255;
}
if (M[i][j] < 0) {
M[i][j] = 0;
}
} else {
M[i][j] = (int) M1[i][j];
if (M[i][j] > 255) {
M[i][j] = 255;
}
if (M[i][j] < 0) {
M[i][j] = 0;
}
}
}
}
}
static void cout() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(M[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Q[i][j] = in.nextInt();
}
}
int n = in.nextInt();
int T = in.nextInt();
int[] m = new int[n];
for (int i = 0; i < n; i++) {
m[i] = in.nextInt();
}
boolean up = true;
for (int i = 0, j = 0, k = 0; k < n; k++) {
// System.out.println("i= "+i+" j= "+j);
M[i][j] = m[k];
// 更新游标
if (i == 0 || j == 0 || i == 7 || j == 7) {
if (i == 0 && j % 2 == 0) {
j++;
} else if (i == 0 && j % 2 == 1) {
i++;
j--;
up = false;
} else if (j == 0 && i % 2 == 1 && i != 7) {
i++;
} else if (j == 0 && i % 2 == 0) {
i--;
j++;
up = true;
} else if (i == 7 || i + j > 7) { // 从左下角开始反转
if (i == 7 && j % 2 == 0) {
j++;
} else if (i == 7 && j % 2 == 1) {
i--;
j++;
up = true;
} else if (j == 7 && i % 2 == 1) {
i++;
} else if (j == 7 && i % 2 == 0) {
i++;
j--;
up = false;
}
}
} else { // 不在正方形一周时的情况
if (!up) {
i++;
j--;
} else {
i--;
j++;
}
}
}
if (T == 0) {
cout();
} else if (T == 1) {
four();
cout();
} else {
four();
five();
six();
cout();
}
}
}