博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迷宫(maze)
阅读量:5166 次
发布时间:2019-06-13

本文共 1187 字,大约阅读时间需要 3 分钟。

【from new_dtoj 3990: 迷宫(maze)】

题目描述
迷宫可以抽象成一个矩阵,小K要从(1,1)走到(N,M),而且只能往下和往右走,即小K只能从(X,Y)走到(X,Y+1)和(X+1,Y)。小K不能走出迷宫(即X>N或Y>M)。当然,迷宫有一些格子是被堵住的,小K不能从这些格子经过。 每个没被堵住的格子都有一个权值,小K十分喜欢X这个数字和异或这个运算。所以他希望所有他经过的格子的异或和为X。现在小K想知道他有多少种走法,听说你是一位大佬蒟蒻 ,于是他向你求助。
N,M<=20,Ai<=1e9
题解
考场正解,细节错误,数据太强只有暴力分
因为从起点直接往终点dfs会超时,所以我们分成两半来做
第一次从起点走到对角线就不走了,然后在对角线统计前一部分的答案
然后再从终点往前走,碰到对角线就统计最后答案,数据太小可以过
效率O(2n∗n)O(2^n*n)O(2nn)
具体细节见代码

#include 
#include
#include
using namespace std;int n,m,k,a[25][25],d[25][25],ax,f[25][25][10005];long long ans;vector
p[405];void D1(int x,int y,int s){ if (x+y==(n+m)/2+1){ p[d[x][y]].push_back(s); return; } if (x
1 && a[x-1][y]) D2(x-1,y,s^a[x-1][y]); if (y>1 && a[x][y-1]) D2(x,y-1,s^a[x][y-1]);}int main(){ scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&a[i][j]),ax=max(a[i][j],ax),d[i][j]=(i-1)*m+j; D1(1,1,0); for (int i=1;i<=d[n][m];i++) sort(p[i].begin(),p[i].end()); D2(n,m,a[n][m]); printf("%lld\n",ans); return 0;}

转载于:https://www.cnblogs.com/xjqxjq/p/10544719.html

你可能感兴趣的文章
语言基础(9):static, extern 和 inline
查看>>
ES5_03_Object扩展
查看>>
bzoj 2600: [Ioi2011]ricehub
查看>>
创建数据库,表
查看>>
工厂模式
查看>>
计算机网络基础知识
查看>>
C#里如何遍历枚举所有的项
查看>>
如何在键盘出现时滚动表格,以适应输入框的显示
查看>>
超级强大的鼠标手势工具
查看>>
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
跟着辛星用PHP的反射机制来实现插件
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>
静态库制作-混编(工程是oc为基础)
查看>>