Codeforces 106D Treasure Island【思维+二维前缀和】
来源:互联网 发布:淘宝 多隆 编辑:程序博客网 时间:2024/06/06 17:48
题目大意:
给出一个N*M的地图,现在最多有26个人,分别用26个字母表示分落在地图各处,#代表墙,现在有q个操作,表示让每个人按照没一轮次都按照要求方向走len步,问哪几个人可以将所有操作都走完的过程中,不会撞墙。
思路:
显然按照Bfs去模拟的话,会TLE。我们考虑问题的特点。
我们知道,每一次操作都是按照一个方向去走的,我们要判定的问题只有是否撞墙这一个点。
那么我们不妨预处理出4个前缀和,N【i】【j】表示在(i,j)这个点上,往北走多少步之内不会撞墙。
其他3个方向同理即可。
那么我们只需要O(26*q)去模拟判定即可。
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;char a[1500][1500];int N[1500][1500];int S[1500][1500];int E[1500][1500];int W[1500][1500];char op[150000][3];int move[150000];int q,ok,n,m;int Slove(int x,int y){ for(int i=1;i<=q;i++) { if(op[i][0]=='N') { if(N[x][y]-move[i]>=0) { x-=move[i]; } else return 0; } if(op[i][0]=='S') { if(S[x][y]-move[i]>=0) { x+=move[i]; } else return 0; } if(op[i][0]=='W') { if(W[x][y]-move[i]>=0) { y-=move[i]; } else return 0; } if(op[i][0]=='E')//dong { if(E[x][y]-move[i]>=0) { y+=move[i]; } else return 0; } } ok=1; return 1;}int main(){ while(~scanf("%d%d",&n,&m)) { ok=0; for(int i=1;i<=n;i++)scanf("%s",a[i]+1); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(a[j][i]=='#')N[j][i]=0; else N[j][i]=N[j-1][i]+1; } for(int j=n;j>=1;j--) { if(a[j][i]=='#')S[j][i]=0; else S[j][i]=S[j+1][i]+1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]=='#')W[i][j]=0; else W[i][j]=W[i][j-1]+1; } for(int j=m;j>=1;j--) { if(a[i][j]=='#')E[i][j]=0; else E[i][j]=E[i][j+1]+1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { N[i][j]--; S[i][j]--; W[i][j]--; E[i][j]--; } } scanf("%d",&q); for(int i=1;i<=q;i++)scanf("%s%d",op[i],&move[i]); for(int z=1;z<=26;z++) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]-'A'+1==z) { int tmp= Slove(i,j); if(tmp==1)printf("%c",a[i][j]); } } } } if(ok==0)printf("no solution\n"); printf("\n"); }}
阅读全文
0 0
- Codeforces 106D Treasure Island【思维+二维前缀和】
- Codeforces 106D Treasure Island 预处理前缀和+暴力(水
- Codeforces 106 D. Treasure Island(前缀和预处理)
- Codeforces 106 D Treasure Island
- cf 106d Treasure Island
- [CodeForces 677D] Vanya and Treasure (二维树状数组+静态前缀最小值)
- Codeforces 651D Image Preview【思维+二分+前缀后缀和】
- Codeforces 846D Monitor(二维前缀和)
- codeforces 846D (二分+二维前缀和)Monitor
- Codeforces 677D Vanya and Treasure【dp+极限思维剪枝】
- Codeforces 835C Star sky【思维+暴力预处理二维前缀和】
- Codeforces835C-Star sky(二维前缀和+思维)
- CFgym:Treasure Island(搜索 & 思维)
- Codeforces 851D Arpa and a list of numbers【思维+前缀和】
- codeforces Star sky(二维前缀和)
- 二维前缀和 codeforces 832C
- codeforces 835C(二维前缀和)
- [高维前缀和] Codeforces 449D
- 解决excle 加密,500错误问题
- Struts2 的配置文件优化
- Bone Collector(01背包模板)
- 算法预备学习--C++,java算法与数据结构
- Robot Framework自动化测试(四)--- 分层思想
- Codeforces 106D Treasure Island【思维+二维前缀和】
- Java以UTF-8编码读写文件
- 《TP5.0学习笔记---发送邮件服务封装》
- (一)顺序表和单链表的初始化、插入、删除等操作
- Redis数据备份与恢复
- 关于使用Listview,item内子项列表数据为空时解决方案
- 解决Failed to load D:\Android-Studio\sdk\build-tools\26.0.1\lib\dx.jar
- Bzoj-1131 Sta [DFS]
- Mybatis——动态SQL详解