文章目录
-
- 题意
- 题解
题意
一个 n × n n\times n n×n方阵的每个位置都有一个数字, n n n是偶数.但现在我们只知道与每个位置相邻的四个位置的数字的异或值,并要求整个方阵中所有数字的异或值.
题解
首先,我们画画,发现如果我们选择一个位置,相当于点亮它周围的灯,我们的目的是点亮整个方阵,每个位置只点击一次.所以当我们选择相邻的两个位置时,点亮的位置只是不重复,我们称相邻的两个方形点亮的格子为拼图.所以只需要用这样的拼图完全覆盖整个图片。.点亮的过程可以贪心,只要一个位置能与下面的方格或右边的方格形成一个未使用的拼图,我们就可以直接贪婪地拼写。.轻松一次通过.
#include<bits/stdc .h> //Ithea Myse Valgulious const int yuzu=3e5,aoi=1018; typedef int fuko[yuzu|10]; fuko a; typedef int yuri[aoi]; yuri vis[aoi],b[aoi]; int main() {
for (int t=read();t--;) {
int n,i,j,ans=0; read(n); for (i=0;i<=n; i) for (j=0;j<=n;/span>++j) vis[i][j]=0; for (i=1;i<=n;++i) for (j=1;j<=n;++j) b[i][j]=read(); auto lit=[&](int x,int y,int p) {
if (x<0||x>n||y<0||y>n) return 1; if (p) return vis[x][y]=1; return vis[x][y]?0:1; }; auto ck=[&](int x,int y,int p=0) {
return lit(x+1,y,p)&&lit(x-1,y,p)&&lit(x,y+1,p)&&lit(x,y-1,p); }; for (i=1;i<=n;++i) {
for (j=1;j<=n;++j) {
if (j<n&&ck(i,j)&&ck(i,j+1)) {
ck(i,j,1),ck(i,j+1,1); ans^=b[i][j]^b[i][j+1]; } if (i<n&&ck(i,j)&&ck(i+1,j)) {
ck(i,j,1),ck(i+1,j,1); ans^=b[i][j]^b[i+1][j]; } } } printf("%d\n",ans); } }
谢谢大家.