题目
测试结果
代码示例
#include <iostream>
#include <bits/stdc++.h>
#define PI acos(-1)
using namespace std;
int M[8][8];
int M1[8][8];
float M2[8][8];
int M3[8][8];
int Q[8][8];
double para(int x)
{
return x==0?sqrt(0.5):1;
}
int main()
{
int n;
int T;
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
cin >> Q[i][j];
}
}
cin >> n >> T;
int view_array[n];
for(int i=0; i<n; i++){
cin >> view_array[i];
}
M[0][0]=view_array[0];
int x=0,y=0,z=0,tag=0,sum=1;
while(z<n-1){
if(sum<36){
if(tag==0){
M[x][++y]=view_array[++z];
sum++;
tag=1;
}
else if(tag==2){
M[++x][y]=view_array[++z];
sum++;
tag=3;
}
else if(tag==1){
M[++x][--y]=view_array[++z];
sum++;
if(y==0) tag=2;
}
else if(tag==3){
M[--x][++y]=view_array[++z];
sum++;
if(x==0) tag=0;
}
}
else{
if(tag==2){
M[x][++y]=view_array[++z];
sum++;
tag=3;
}
else if(tag==3){
M[--x][++y]=view_array[++z];
sum++;
if(y==7) tag=0;
}
else if(tag==0){
M[++x][y]=view_array[++z];
sum++;
tag=1;
}
else if(tag==1){
M[++x][--y]=view_array[++z];
sum++;
if(x==7) tag=2;
}
}
}
//填充后的矩阵和量化矩阵相乘
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
M1[i][j] = M[i][j]*Q[i][j];
}
}
if(T==0){
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
cout << M[i][j] << " ";
}
cout << endl;
}
}
else if(T==1){
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
cout << M1[i][j] << " ";
}
cout << endl;
}
}
else if(T==2){
//离散变换
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
for(int k=0; k<8; k++){
for(int l=0; l<8; l++){
M2[i][j]+=para(k)*para(l)*M1[k][l]*(cos((PI*0.125)*(i+0.5)*k))*(cos((PI*0.125)*(j+0.5)*l));
}
}
M2[i][j]=(M2[i][j]*0.25);
}
}
//离散变换后+128并就近取整
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
M2[i][j]=M2[i][j]+128;
int temp = M2[i][j];
double del = M2[i][j] - temp;
if (del >= 0.5) temp+=1;
M3[i][j]=temp;
if(M3[i][j]>255){
M3[i][j]=255;
}
else if(M3[i][j]<0){
M3[i][j]=0;
}
}
}
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
cout << M3[i][j] << " ";
}
cout << endl;
}
}
return 0;
}
思路
这个题就很简单了,和以前得题目相比这个题可能还没达到第二题的难度。总体写下来感觉有两个需要关注的点吧。
(1)扫描数据并填充矩阵
这里我用的方法就很简单的,在图的上三角的游走轨迹进行标记并判断是否到边界,同样在下三角的游走轨迹也进行标记和判断边界,根据游走轨迹找x和y的规律变化,同时在右下角的时候记得要标记衔接,我是以填充上三角的数量来判断是否到达了需要改变轨迹的位置。
(2)+128并就近取整
这个取整过程一定要在离散变换之后加上128后再取整(四舍五入)。
M2[i][j]=M2[i][j]+128;
int temp = M2[i][j];
double del = M2[i][j] - temp;
if (del >= 0.5) temp+=1;
M3[i][j]=temp;