从起点和终点双向搜索在中间相遇时更新答案
#include<bits/stdc++.h>
using namespace std;
long long n,m,k;
long long dp[25][25];
map<long long,long long >mp[25][25];
long long ans;
void dfs1(int x,int y,long long val)
{
if((x+y-2)==(n+m-2)/2)//注意是n+m-2,只搜一半就可以了
{
mp[x][y][val]++;
return ;
}
if(x+1<=n)dfs1(x+1,y,val^dp[x+1][y]);
if(y+1<=m)dfs1(x,y+1,val^dp[x][y+1]);
}
void dfs2(int x,int y,long long val)
{
if(mp[x][y].size()>0)
{
ans+=mp[x][y][val^k^dp[x][y]];
return ;
}
if(x-1>=1)dfs2(x-1,y,val^dp[x-1][y]);
if(y-1>=1)dfs2(x,y-1,val^dp[x][y-1]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
//mp[i][j].clear();
cin>>dp[i][j];
}
}
dfs1(1,1,dp[1][1]);
dfs2(n,m,dp[n][m]);
cout<<ans<<endl;
//printf("%lld\n",ans);
return 0;
}