思路就是折半搜索,可以降低很多时间复杂度,因为当地图小的时候,n+m就不满足折半的条件了,所以这里用n+m+2作为条件,首先我们先搜索步数为n+m+2的一半的值为搜索终点,记录当前的异或值,然后再从终点开始搜索,当搜索到n+m+2的一半的时候,我们判断当前点的与k的异或值是否有标记过,有的话就说明这整个一条路的异或值等于k,直接加给ans就好了
注意范围大小 。
dfs 边界判断
#include<bits/stdc++.h> using namespace std; long long n,m,ans,k; map<long long,long long>ap[25]; long long mmp[25][25]; void dfsone(int x,int y,long long cur) { if(x>n||y>m) return ; cur^=mmp[x][y]; if(x+y==(n+m)/2+1) { ap[x][cur]++; return ; } dfsone(x+1,y,cur); dfsone(x,y+1,cur); } void dfstwo(int x,int y,long long cur) { if(x<1||y<1) return ; if(x+y==(n+m)/2+1) { ans+=ap[x][cur]; return ; } cur^=mmp[x][y]; dfstwo(x-1,y,cur); dfstwo(x,y-1,cur); } int main() { cin>>n>>m>>k; ans=0; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>mmp[i][j]; dfsone(1,1,0); dfstwo(n,m,k); cout<<ans<<endl; return 0; }