题目 题意:现在有一个 n ∗ n n*n n∗n的数组 a a a( n n n为偶数),但是丢失了它的数据,我们只知道,每个元素的相邻元素的异或和,构成的数组 b b b。相邻元素是指,元素的上下左右相邻的元素。现在已知 b b b,求原数组 a a a的所有元素的异或和。
参考Adityakumar007的提交代码。
思路:求 b b b所有元素的异或和,肯定会重复计算。我们可以遍历数组 b b b,在计算当前元素 b i j b_{ij} bij之前,先判断它贡献的相邻元素 a [ i − 1 ] [ j ] , a [ i + 1 ] [ j ] , a [ i ] [ j − 1 ] , a [ i ] [ j + 1 ] a[i-1][j],a[i+1][j],a[i][j-1],a[i][j+1] a[i−1][j],a[i+1][j],a[i][j−1],a[i][j+1],是否别的 b b b元素已经贡献过。如果贡献过,则当前的 b i j b_{ij} bij不加进来。
通过这个策略,我们可以保证每个 a i j a_{ij} aij元素只会贡献一次。同时,每个 a i j a_{ij} aij都会被统计进来。
如图4x4的例子,红色数字表示遍历过程中有效的
b
b
b位置,圆圈数字表示每个有效
b
b
b位置的贡献点,我们可以看到,所有位置都有一个贡献点。严格证明不会,就拿图片感性理解,凑合下吧_(:з」∠)_
#include
using namespace std;
const int maxn = 1010;
#define ll long long
int n;
int a[maxn][maxn];
bool vis[maxn][maxn];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
bool check(int x, int y) {
bool flag = 1;// 判断贡献的位置,是否别人已经贡献过
for (int i = 0; i = 0 && xx = 0 && yy
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?