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]]; 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; }
|