Codeforces 106D Treasure Island 预处理前缀+暴力(水
主题链接:点击打开链接
意甲冠军:
特定n*m矩阵
# 是墙 . 和字母是平地
最多有26个字母(不反复出现)
以下k个指令。
每一个指令代表移动的方向和步数。
若以某个字母为起点,依次运行全部的指令,不论什么过程都不会撞到墙或走出地图。则这个字母合法。
按字典序输出全部合法的字母。若没有字母合法则输出' no solution'
预处理一下前缀和然后暴力。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
using namespace std;
#define N 1005
vector<char>ans;
struct node{
int x, y;
char c;
void put(){printf("(%d,%d) : %c\n", x, y, c);}
}a[30];
int step[4][2] = {-1,0, 1,0, 0,-1, 0,1};
int work[100005][2];
char s[N];
int mp[N][N], n, m, k, top, h[N][N], l[N][N];
bool okh(int H, int x, int y){return h[H][y]-h[H][x-1] == 0;}
bool okl(int L, int x, int y){return l[L][y]-l[L][x-1] == 0;}
bool ok(int x, int y, int i, int j){
if(x>i)swap(x,i); if(y>j)swap(y,j);
if(x==i)
return okh(x, y, j);
else
return okl(y, x, i);
}
bool inmap(int x, int y){return 1<=x&&x<=n&&1<=y&&y<=m;}
bool judge(int x, int y){
for(int i = 0; i < k; i++) {
int ux = step[work[i][0]][0] * work[i][1] + x, uy = step[work[i][0]][1] *work[i][1] + y;
if(!inmap(ux,uy))return false;
if(!ok(x, y, ux, uy))return false;
x = ux; y = uy;
}
return true;
}
void debug(){for(int i = 0; i < top; i++)a[i].put();}
void solve(){
// debug();
ans.clear();
for(int i = 0; i < top; i++)
if(judge(a[i].x, a[i].y))
ans.push_back(a[i].c);
if(ans.size()==0){
puts("no solution");
return ;
}
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++)printf("%c",ans[i]);
puts("");
}
void input(){
top = 0;
memset(mp, 0, sizeof mp);
memset(h, 0, sizeof h);
memset(l, 0, sizeof l);
for(int i = 1; i <= n; i++){
scanf("%s", s+1);
for(int j = 1; j <= m; j++)
{
if(s[j]=='#')
{
mp[i][j] = 1;
h[i][j] = 1;
l[j][i] = 1;
}
else if('A'<=s[j] && s[j]<='Z'){
a[top].x = i; a[top].y = j; a[top].c = s[j];
top++;
}
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
h[i][j] += h[i][j-1];
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
l[i][j] += l[i][j-1];
scanf("%d",&k);
for(int i = 0; i < k; i++){
scanf("%s %d", s, &work[i][1]);
if(s[0] == 'N') work[i][0] = 0;
else if(s[0]=='S') work[i][0] = 1;
else if(s[0]=='W') work[i][0] = 2;
else work[i][0] = 3;
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
input();
solve();
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
Codeforces 106D Treasure Island 预处理前缀+暴力(水的更多相关文章
- [Codeforces 1214D]Treasure Island(dfs)
[Codeforces 1214D]Treasure Island(dfs) 题面 给出一个n*m的字符矩阵,'.'表示能通过,'#'表示不能通过.每步可以往下或往右走.问至少把多少个'.'变成'#' ...
- CodeForces 838A Binary Blocks(前缀和)题解
题意:给你个n*m的矩阵,要求你找到一个k,k > 1,使得矩阵可以分为很多k * k的小正方形,然后进行操作把每个小正方形都变为0或1,问你怎样使操作数最小. 思路:随便暴力不可取,显然你每次 ...
- Gym 100971A Treasure Island BFS 思维题
A - Treasure Island Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- [Codeforces 1201D]Treasure Hunting(DP)
[Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...
- D. Treasure Island
D. Treasure Island dfs大法好== 写半天bfs疯狂MLE dfs标记掉路上的一些点 然后再跑一遍dfs #include<bits/stdc++.h> using n ...
- Treasure Island DFS +存图
All of us love treasures, right? That's why young Vasya is heading for a Treasure Island. Treasure I ...
- Codeforces Round #280 (Div. 2) A B C 暴力 水 贪心
A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Karen and Coffee CodeForces - 816B (差分数组+预处理前缀和)
To stay woke and attentive during classes, Karen needs some coffee! Karen, a coffee aficionado, want ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A B C D 暴力 水 二分 几何
A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- oled屏幕模块
oled屏幕模块似乎是厂家提供的 也许可以根据屏幕驱动芯片去写 根据现在了解的芯片一般有两个:SH1106和SSD1306 不过这次我们用的是SSD1306芯片驱动的屏幕 下面是从裸屏到模块的pcb: ...
- 洛谷——P1774 最接近神的人_NOI导刊2010提高(02)
https://www.luogu.org/problem/show?pid=1774 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古 ...
- (嵌入式开发)自己写bootloader之编写第一阶段
最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH 2. 如果bootloader比较大,要把它重定位到SDRAM 3. 把内核 ...
- HDU 1284 钱币兑换问题 母函数、DP
题目链接:HDU 1284 钱币兑换问题 钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- C# .NET Socket
C# .NET Socket 简单实用框架 背景: 首先向各位前辈,大哥哥小姐姐问一声好~ 这是我第一次写博客,目前为一个即将步入大四的学生,上学期在一家公司实习了半年,后期发现没有动力,而且由于薪水 ...
- angular自定义指令相关知识及代码
原文地址 https://www.jianshu.com/p/0c015862156d 大纲 1.自定义指令之——属性指令 2.自定义属性指令的运行原理 3.自定义属性指令代码实践 4.自定义结构指令 ...
- 多事务运行并发问题spring学习笔记——数据库事务并发与锁详解
多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...
- python 如何使用pip安装第三方软件
1. 先将sripts加入系统的环境变量path中.如笔者的路径为: D:\Program Files\Python35\Scripts 2. 启动cmd,如安装request 过程十分简单,但是也容 ...
- iOS 【UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧】
在UIScrollView中会加入UIPageControl作为页码标识,能够让用户清楚的知道当前的页数.我们须要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们 ...
- [SCSS] Loop Over Data with the SCSS @each Control Directive
The SCSS @for directive is great when we know how many iterations are required and we only need 1 va ...