题意略。

思路:

双向bfs。

如图,对于曼哈顿距离为5的地方来说,除去两端的位置,其他位置的状态不会超过曼哈顿距离为4的地方的状态的两倍。

所以,最大曼哈顿距离为n + m。最多的状态不过2 ^ (n + m)。

这个复杂度我们不能接受,但是如果我们从两边向中间bfs的话, 每次bfs的复杂度为2 ^ ((n + m)/2)。

所以可以用双向广搜来解决。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int maxn = ;
  5.  
  6. struct point{
  7. int x,y;
  8. LL state;
  9. point(int a = ,int b = ){
  10. x = a,y = b;
  11. }
  12. point operator+ (const point& p){
  13. return point(x + p.x,y + p.y);
  14. }
  15. int sum(){
  16. return x + y;
  17. }
  18. bool operator< (const point& p) const{
  19. if(x != p.x) return x < p.x;
  20. else if(y != p.y) return y < p.y;
  21. else return state < p.state;
  22. }
  23. };
  24.  
  25. point mov1[] = {point(,),point(,)};
  26. point mov2[] = {point(-,),point(,-)};
  27.  
  28. LL board[maxn][maxn];
  29. LL n,m,k;
  30. map<point,LL> mp;
  31.  
  32. void bfs1(point s){
  33. int line = ((n + m)>>) + ;
  34. s.state = board[s.x][s.y];
  35. queue<point> que;
  36. que.push(s);
  37. while(que.size()){
  38. point temp = que.front();
  39. que.pop();
  40. if(temp.sum() == line){
  41. ++mp[temp];
  42. continue;
  43. }
  44. for(int i = ;i < ;++i){
  45. point nxt = temp + mov1[i];
  46. if(nxt.x > n || nxt.y > m) continue;
  47. nxt.state = temp.state xor board[nxt.x][nxt.y];
  48. que.push(nxt);
  49. }
  50. }
  51. }
  52. LL bfs2(point s){
  53. LL ret = ;
  54. int line = ((n + m)>>) + ;
  55. s.state = k xor board[s.x][s.y];
  56. queue<point> que;
  57. que.push(s);
  58. while(que.size()){
  59. point temp = que.front();
  60. que.pop();
  61. if(temp.sum() == line){
  62. ret += mp[temp];
  63. continue;
  64. }
  65. for(int i = ;i < ;++i){
  66. point nxt = temp + mov2[i];
  67. if(nxt.x < || nxt.y < ) continue;
  68. nxt.state = temp.state xor board[nxt.x][nxt.y];
  69. que.push(nxt);
  70. }
  71. }
  72. return ret;
  73. }
  74.  
  75. int main(){
  76. scanf("%lld%lld%lld",&n,&m,&k);
  77. for(int i = ;i <= n;++i){
  78. for(int j = ;j <= m;++j){
  79. scanf("%lld",&board[i][j]);
  80. }
  81. }
  82. bfs1(point(,));
  83. int line = ((n + m)>>) + ;
  84. for(int i = ;i <= n;++i){
  85. int j = line - i;
  86. if(j <= ) continue;
  87. board[i][j] = ;
  88. }
  89. LL ans = bfs2(point(n,m));
  90. printf("%lld\n",ans);
  91. return ;
  92. }

Codeforces 1006F的更多相关文章

  1. [CodeForces]1006F Xor Path

    双向搜索. 水div3的时候最后一道题由于C题死活看不懂题 来不及做F了Orz.. 因为n,m是20,双向搜索一下,求个到中间的Xor值的方案,统计一下即可. 时间复杂度\(O(2^{21})\) 好 ...

  2. CodeForces - 1006F (深搜从两端向中间搜,省时)

    题意:输入n,m,k,给出一个n*m的图,里面有权值,从1,1一路异或到n,m,只能向右或向下走,等于k有多少种路径. 思路:一开始就是直接暴力写个深搜,稳稳的超时,分析一下时间复杂度.每个点有两个方 ...

  3. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  4. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  5. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  6. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  7. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  8. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  9. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

随机推荐

  1. linux初学者-软件安装与管理篇

    linux初学者-软件安装与管理篇 在linux的学习和工作中需要安装许多的软件.在redhat的linux操作系统下,软件一般都是rpm格式的.以下将介绍一些软件安装和管理的内容. 1.软件名称 在 ...

  2. python中的内存机制

    首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用) a=1,b=1 i ...

  3. ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

    前言 本文我们来探讨下JWT VS Session的问题,这个问题本没有过多的去思考,看到评论讨论太激烈,就花了一点时间去研究和总结,顺便说一句,这就是写博客的好处,一篇博客写出有的可能是经验积累,有 ...

  4. JWT token 跨域认证

    JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中,将sessio ...

  5. oracle实战(一)

    一.表空间的创建以及删除 声明:此操作环境为windows,oracle10G 表空间? ORACLE数据库的逻辑单元. 数据库---表空间 一个表空间可以与多个数据文件(物理结构)关联 一个数据库下 ...

  6. JAVA开始(基础篇)

    数据类型 Boolean        1位Byte              1个字节(8位)Short             2个字节Char              2个字节Int      ...

  7. Hadoop 系列(七)—— HDFS Java API

    一. 简介 想要使用 HDFS API,需要导入依赖 hadoop-client.如果是 CDH 版本的 Hadoop,还需要额外指明其仓库地址: <?xml version="1.0 ...

  8. Danjgo学习笔记(一)

    ## 创建项目: 1. 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: ``` django-admin startproject [项目的名称] ``` 这样就可以在当 ...

  9. 基于opencv,开发摄像头播放程序

    前言 Windows下实现摄像视频捕捉有多种实现方式:各种方式的优劣,本文不做对比.但是,opencv是一款老牌开发库,在图像处理领域声名显赫.采用opencv来处理摄像视频,在性能和稳定性上,是有保 ...

  10. IPC机制1

    1.Android IPC简介 Inter-Process Communication的缩写就是IPC,含义是进程间通信或是跨进程间通信,是指两个进程进行交换数据的过程. 进程是什么? 进程在pc上就 ...