原题链接:蓝桥杯2023年第十四届省赛真题-棋盘
解题思路:
差分矩阵模板题,了解差分矩阵前需要依次了解 前缀和 -> 一维差分 -> 前缀和矩阵 -> 差分矩阵
前缀和 给定一个数组,构造 前缀和数组,求区间 [l,r]的和,只需要 sum[r] - sum[l-1];即可
一维差分是 前缀和的逆运用, 多用于将区间[l,r]内的所有数加上某一个值(可以是负值)
二维前缀和是一维前缀和的拓展, 用于求原始矩阵 的子矩阵的和,
二维差分是二维前缀和的逆运用,用于求 子矩阵 内所有数的同一增量的修改后的 矩阵
注意事项:
本题 要借助 前缀和 和 差分的思路构造前缀积的概念,本题的白子可以设为1,黑子设为 -1,本题涉及的增量只有一个-1,即白子1,乘-1得-1变成黑子,同理黑子-1乘-1得1变成白子,本题在一个子矩阵内所有棋子反转颜色 ,符合 前缀积的概念,因此可以使用差分思路
参考代码:
package com.蓝桥真题._14届;
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
/**
* ClassName: F棋盘
* Package: com.蓝桥真题._14届
* Describe:
3 3
1 1 2 2
2 2 3 3
1 1 3 3
ans:
001
010
100
* @Create 2023/04/10 10:49
*/
public class F棋盘 {
static int n,m;static int[][] map;
public static void main(String[] args) throws Exception {
n = nextInt(); m = nextInt(); map = new int[n + 4][n + 4];
for(int [] row : map) Arrays.fill(row,1);
//show();
for(int i = 0; i < m; i++){ insert(nextInt(),nextInt(),nextInt(),nextInt(),-1); }
//pw.println("---------------------"); show();
for(int i =1; i <= n; i++){
for(int j = 1; j <= n; j++){
map[i][j] *= map[i - 1][j] * map[i][j-1] / map[i - 1][j - 1];
pw.print(map[i][j] == 1 ? 0 : 1);
}
pw.println();
}
pw.flush();
}
static void insert(int x1,int y1,int x2,int y2,int q){
map[x1][y1] *= q;
map[x2 + 1 ][y1] /= q;
map[x1][y2 +1 ] /= q;
map[x2 + 1][y2 + 1] *= q;
}
static void show(){
for(int[] row : map){
for(int col : row)pw.printf("%3d",col);
pw.println();
}
}
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
}0.0分
7 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复