从起点和终点双向搜索在中间相遇时更新答案

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