F - Xor-Paths (复杂运算-折半dfs)

  思路就是折半搜索,可以降低很多时间复杂度,因为当地图小的时候,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;
}

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/81487057