题意:一个矩阵上面有0~9的数字,可以从任意一个格子出发,每次根据格子上的数字会前进到另一个格子(或原地不动),现在给出q个数位串,问是否有走法可以取出这个串(走到格子上的时候可以不取)。

思路:发现每个点的出度至多为1,那么可以预处理出走到这个格子后取某个数字最近的格子是哪个(f[i][j][0-9]),然后用队列存下开头,在做一遍贪心就可以了

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
int cnt,sz=0,f[201*201][10],c[201][201],id[201][201],vis[201][201],n,m,a[10],b[10],ans[201*201],d[201*201];
int read(){char ch=getchar();int f=1,t=0;while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}return t*f;
}
void dfs(int x,int y){int dx=x+a[c[x][y]],dy=y+b[c[x][y]];if (dx<1||dx>n||dy<1||dy>m) f[id[x][y]][c[x][y]]=id[x][y];else{f[id[x][y]][c[x][y]]=id[dx][dy];if (!vis[dx][dy]) {vis[dx][dy]=1;dfs(dx,dy);}for (int i=0;i<=9;i++)if (i!=c[x][y])f[id[x][y]][i]=f[id[dx][dy]][i];}
}
int main(){n=read();m=read();int T=read();cnt=0;for (int i=1;i<=n;i++){char s[2005];scanf("%s",s+1);for (int j=1;j<=m;j++){c[i][j]=s[j]-'0';id[i][j]=++cnt;d[cnt]=c[i][j];     }}   char s[1000005];for (int i=0;i<=9;i++)a[i]=read(),b[i]=read();for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (!vis[i][j]){vis[i][j]=1;ans[++sz]=id[i][j];dfs(i,j);}while (T--){scanf("%s",s+1);bool flag=false;for (int i=1;i<=sz;i++){int x=ans[i];for (int j=1;j<=strlen(s+1);j++){x=f[x][s[j]-'0'];if (x<=0) break;}if (x>0) {flag=true;break;}}if (flag) printf("YES\n");else printf("NO\n");}
}

转载于:https://www.cnblogs.com/qzqzgfy/p/5682558.html

codeforces 596E Wilbur and Strings相关推荐

  1. codeforces 596E Wilbur and Strings(DFS)

    题目链接 E. Wilbur and Strings time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  2. CodeForces - 798B Mike and strings

    B. Mike and strings time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  3. CodeForces 596B Wilbur and Array 贪心

    给出原始{ai}={0},{bi}.每次修改{ai..n}+1或-1,求最小操作次数使{ai}=={bi}. 累计相邻两数差即可. 因为差最大10^9,数字有2*10^5,要long long. #i ...

  4. Codeforces 596D Wilbur and Trees

    http://codeforces.com/contest/596/problem/D 题目大意: 有n棵树排成一排,高度都为h. 主人公要去砍树,每次等概率地随机选择没倒的树中最左边的树或者最右边的 ...

  5. Codeforces 149 E. Martian Strings

    正反两遍扩展KMP,维护公共长度为L时,出现在最左边和最右边的位置.... 然后枚举判断... E. Martian Strings time limit per test 2 seconds mem ...

  6. CodeForces - 1213E Two Small Strings(暴力+构造)

    题目链接:点击查看 题目大意:给出一个字符串s和字符串t,s和t的长度皆为2,现在要求我们构造出一个字符串res,他的长度是3*n,要求字母a和字母b还有字母c各出现3次,并满足字符串s和字符串t不能 ...

  7. Codeforces 596D Wilbur and Trees dp (看题解)

    一直在考虑, 每一段的贡献, 没想到这个东西能直接dp..因为所有的h都是一样的. #include<bits/stdc++.h> #define LL long long #define ...

  8. CodeForces 596C Wilbur and Points

    先对n个点分类,然后按题意要求构造,构造的时候判断这个点的右上方之前是否有点,判断可以用线段树来操作. #include<cstdio> #include<cstring> # ...

  9. CodeForces 596B Wilbur and Array

    简单题,一个一个操作,最后就是答案. #include<cstdio> #include<cstring> #include<cmath> #include< ...

最新文章

  1. Hazelcast集群服务(2)——Hazelcast基本配置
  2. Linux文件查找之findlocate
  3. python控制鼠标_如何使用Python在Mac中控制鼠标?
  4. 富文本框让最大四百像素_富文本框的使用
  5. 基于python的分布式扫描器_一种基于python的大数据分布式任务处理装置的制作方法...
  6. 城轨的两类时钟系统均同步于_推介中央电视台4K IP化移动外场系统搭建中解决的主要问题...
  7. springboot学习笔记1
  8. 计算机知识脑筋急转弯,10道智力题图片及答案大全|2018年朋友圈最烧脑的10道智力题 附答案_最火软件站...
  9. 一氧化碳(CO)荧光探针cas855751-82-5,二氧化硫荧光探针 激发波长653 nm,发射波长836 nm-齐岳介绍
  10. 透视表学习(四)想要做好数据分析必知必会排序操作
  11. 学会 Python 到底能干嘛?我们整理出了 7 大工作方向……
  12. 自动驾驶上的三种感知传感器(激光、毫米波雷达和摄像头)优缺点比较
  13. 如何区分项目组合管理,项目集管理,和项目管理
  14. 大话设计模式之爱你一万年:大话设计模式之爱你一万年由来
  15. 网页调起支付宝付款和微信付款
  16. 【EagleEye】2020-ECCV-EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning-论文详解
  17. 哪种程序员最挣钱?平均月薪30.8K,网友说这是掌握世界的技术
  18. 2021华数杯数学建模选题建议
  19. 采样率150KSPS同步触发多板卡同步2路RS485D的3U PXIE采集卡
  20. 王者荣耀 微信登录 服务器找不到,王者荣耀微信无法登录是怎么回事 具体解决方法...

热门文章

  1. 微火上线ai绘画小程序搭建系统,ai绘画小程序源码触手可及
  2. js 把数字转换成万
  3. python 32bit? 64bit?
  4. 如何从Google Play下载应用到电脑
  5. 【Spark重点难点】你从未深入理解的RDD和关键角色
  6. 详细解读大数据分析学习路线
  7. 解决东方财富数据接口激活后仍显示reactive的问题
  8. MATLAB2021b详细安装教程
  9. https 服务所需证书
  10. 前窗玻璃膜贴了一周还有气泡_新车前挡风玻璃贴膜后有气泡几天能下去