思路就是折半搜索,可以降低很多时间复杂度,因为当地图小的时候,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;
}
本文介绍了一种使用折半搜索算法解决特定路径异或值等于给定值k的问题的方法。通过将地图划分为两部分,并分别进行深度优先搜索(DFS),文章详细解释了如何有效地减少计算时间复杂度。
430

被折叠的 条评论
为什么被折叠?



