Steven_MengのBlog

传送门

题解

双向搜索,$Map[x][y][n]$表示搜索到$(x,y)$异或和为n有多少种方法。
还要利用异或的性质:

1
(a^b)^b=a

记得开long long

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
#include <hash_map>
#define MAXN 25
#define int long long
using namespace std;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=(x*10)+(ch-'0');
ch=getchar();
}
return x*f;
}
#define inside(x,y) 1<=x&&x<=n&&1<=y&&y<=m
unordered_map<int,int>Map[MAXN][MAXN];
int G[MAXN][MAXN],n,m,k;
void dfs1(int x,int y,int Sum){
if (x+y==n+1){Map[x][y][Sum]++;return ;}//必定经过对角线
if (inside(x+1,y)) dfs1(x+1,y,Sum^G[x+1][y]);
if (inside(x,y+1)) dfs1(x,y+1,Sum^G[x][y+1]);
}
int ans;
void dfs2(int x,int y,int Sum){
if (x+y==n+1){
ans+=Map[x][y][Sum^k^G[x][y]];//G[x][y]重复算了一遍
return ;
}
if (inside(x-1,y)) dfs2(x-1,y,Sum^G[x-1][y]);
if (inside(x,y-1)) dfs2(x,y-1,Sum^G[x][y-1]);
}
#undef int
int main(){
#define int long long
n=read(),m=read(),k=read();
for (register int i=1;i<=n;++i){
for (register int j=1;j<=m;++j){
G[i][j]=read();
}
}
dfs1(1,1,G[1][1]);
dfs2(n,m,G[n][m]);
printf("%lld\n",ans);
return 0;
}

 评论