Codeforces 1010F Xor-Paths 【搜索】【暴力!】

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;
 4 
 5 long long a[25][25],ans,k,x1[25];
 6 int n,m,mid;
 7 
 8 map<long long, int> mp[25][25];
 9 
10 void dfs1(int x,int y,long long k1,int cnt){//从x,y的位置搜到中间行  == k1是一路上^得到的数 包括(x,y) 
11     if(cnt==mid) mp[x][y][k1]++;
12     else if(y==m) dfs1(x+1,y, k1^a[x+1][y],cnt+1 );
13     else if(x==n) dfs1(x,y+1, k1^a[x][y+1],cnt+1 ); 
14     else { dfs1(x+1,y,k1^a[x+1][y],cnt+1); dfs1(x,y+1,k1^a[x][y+1],cnt+1); }
15 }
16 
17 void dfs2(int x,int y,long long k1,int cnt){//从x,y的位置搜到第(n+1)/2行  == k1是一路上^得到的数,但没有包括(x,y)
18      if(cnt==n+m-2-mid) ans+=mp[x][y][k^k1];
19     else if(y==1) dfs2(x-1,y, k1^a[x][y],cnt+1 );
20     else if(x==1) dfs2(x,y-1, k1^a[x][y],cnt+1 ); 
21     else { dfs2(x,y-1,k1^a[x][y],cnt+1); dfs2(x-1,y,k1^a[x][y],cnt+1); }
22 }
23 
24 int main(){
25     cin>>n>>m>>k;
26     for(int i=1;i<=n;i++)
27         for(int j=1;j<=m;j++) cin>>a[i][j];
28         
29     mid=(n+m-2)/2;//一共要走n+m-2次,走了一半的次数走到哪哪就定义成中间行的一部分
30     //从(1,1)搜到中间那一行 
31     dfs1(1,1,a[1][1],0); 
32     //从(n,m)搜到中间那一行
33     dfs2(n,m,0,0);
34     cout<<ans;
35     return 0;
36 }

猜你喜欢

转载自www.cnblogs.com/ZhenghangHu/p/9329236.html
今日推荐