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 }
原文地址:https://www.cnblogs.com/ZhenghangHu/p/9329236.html
时间: 2024-10-21 07:10:56