计蒜客 2018 蓝桥杯省赛 B 组模拟赛(五) A. 结果填空:矩阵求和

【题目链接】:https://nanti.jisuanke.com/t/25084

【题目描述】:给你一个 n×n 的矩阵,里面填充 1n x n。例如当 n 等于 3 的时候,填充的矩阵如下。

1    2    3

4    5    6

7    8    9

现在我们把矩阵中的每条边的中点连起来,这样形成了一个新的矩形,请你计算一下这个新的矩形的覆盖的数字的和。比如,n = 3 的时候矩形覆盖的数字如下。

        2

4     5     6

       8

那么当 n 等于 101 的时候,矩阵和是多少?



【解析】:这道题做了很多遍才做对,刚开始没有理解题意,认为只是计算矩阵两条边就可以,其实题目中要求的是计算两条边为对角线的矩形所覆盖的面积。

计蒜客 2018 蓝桥杯省赛 B 组模拟赛(五) A. 结果填空:矩阵求和_第1张图片

其中彩色部分为所求区域,我的思路是将彩色部分分成四部分,分别为左上,右上,左下,右下。四部分相加即可得到结果,其中粉色部分共加了两次,黑色部分共加了四次,因此要减去一次粉色部分再减去的过程中也减去了两次黑色部分,还要再减去一次黑色部分。

【答案】:26020201

【代码】:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = 1;
		int m = sc.nextInt();//输入行列数
		int a[][] = new int[120][120];//将数储存在二维数组中
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= m; j++) {
				a[i][j] = n;//赋值
				n++;
			}
		}
		int sum = 0;//求总和
		/**左上部分求和**/
		for (int i = 1; i <= (m + 1) / 2; i++)
			for (int j = (m + 1) / 2; j > (m + 1) / 2 - i; j--)
				sum += a[i][j];
		/**右上部分求和**/
		for (int i = 1; i <= (m + 1) / 2; i++)
			for (int j = (m + 1) / 2; j < (m + 1) / 2 + i; j++)
				sum += a[i][j];
		/**左下部分求和**/
		for (int i = (m + 1) / 2; i <= m; i++)
			for (int j = i - (m + 1) / 2 + 1; j <= (m + 1) / 2; j++)
				sum += a[i][j];
		/**右下部分求和**/
		int k = m;
		for (int i = (m + 1) / 2; i <= m; i++) {
			for (int j = (m + 1) / 2; j <= k; j++)
				sum += a[i][j];
			k--;
		}
		//求和时位于中点的两条线共加了两遍,因此要减去中间两条线的和
		int sum1 = 0;
		for (int i = 1; i <= m; i++)
			sum1 += a[(m + 1) / 2][i] + a[i][(m + 1) / 2];
         //矩阵最中间的点共加了4遍,减去的两条边中有两遍,因此要再减去一遍
		System.out.println(sum - sum1 - a[(m + 1) / 2][(m + 1) / 2]);
	}
}


你可能感兴趣的:(Java,蓝桥杯)