「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)
题意与分析(CodeForces 540C)
这题坑惨了我。。。。我和一道经典的bfs题混淆了,这题比那题简单。
那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落。然后求可行解。
但是这题。。。是冰塔的一层
也就是说,它只是个稍微有点限制的二维迷宫问题。
后面就好理解了,不过需要考虑下这种数据:
1 2
XX
1 1
1 1
这种数据答案是no。解决的方法可以考虑这样:分成两个数组来记录访问状态:vis数组和block数组。
代码
#include <queue>
#include <set>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
bool iscracked[505][505];
bool vis[505][505];
set<pair<int,int> > s;
int bx,by,ex,ey,n,m;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
bool bfs()
{
queue<pair<int,int> > q;
q.push(MP(bx,by));
s.insert(MP(bx,by));
iscracked[bx][by]=true;
auto end_pair=MP(ex,ey);
while(!q.empty())
{
auto now=q.front(); q.pop();
if(now==end_pair && iscracked[now.fi][now.se] && vis[now.fi][now.se]) return true;
//cout<<"NP: "<<now.fi<<" "<<now.se<<endl;
iscracked[now.fi][now.se]=true;
vis[now.fi][now.se]=true;
rep(i,0,3)
{
int tx=now.fi+dx[i], ty=now.se+dy[i];
if(tx>=1 && tx<=n && ty>=1 && ty<=m && (!iscracked[tx][ty]||(tx==ex&&ty==ey)))
{
auto tstat=MP(tx,ty);
//cout<<"Trying to go"<<tx<<" "<<ty<<" "<<iscracked[tx][ty]<<endl;
if(s.find(tstat)==s.end() || tstat==end_pair)
{
//cout<<" success"<<endl;
s.insert(tstat);
q.push(tstat);
}
}
}
}
return false;
}
int main()
{
cin>>n>>m;
ZERO(iscracked);ZERO(vis);
rep(i,1,n)
{
string str; cin>>str;
rep(j,0,m-1)
{
iscracked[i][j+1]=vis[i][j+1]=str[j]=='X';
}
}
cin>>bx>>by>>ex>>ey;
vis[bx][by]=false;
//if(bx==ex && by==ey && n==1 && m==1)
cout<<string(bfs()?"YES":"NO")<<endl;
return 0;
}
「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)的更多相关文章
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」Queue(Codeforces Round 303 Div.2 D)
简单到让人不敢相信是D题,但是还是疏忽了一点. 题意与分析 (Codeforces 545D) 题意:n人排队,当一个人排队的时间超过他需要服务的时间就会厌烦,现在要求一个最优排列使得厌烦的人最少. ...
- 「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)
这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x ...
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...
- 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)
题意与分析(Codeforces-431C) 题意是这样的:给出K-Tree--一个无限增长的树,它的每个结点都恰有\(K\)个孩子,每个节点到它\(K\)个孩子的\(K\)条边的权重各为\(1,2, ...
- 「专题训练」Boredom(CodeForces Round #260 Div.1 A)
题意(Codeforces-455A) 给你\(n\)个数,你每次可以选择删除去一个数\(x\)获得\(x\)分,但是所有为\(x+1\)和\(x-1\)的数都得删去.问最大获得分数. 分析 这是一条 ...
- DFS/BFS Codeforces Round #301 (Div. 2) C. Ice Cave
题目传送门 /* 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. 若两 ...
- 贪心 Codeforces Round #301 (Div. 2) B. School Marks
题目传送门 /* 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 num1是输出的1的个数,numy是除此之外的数都为y,此时的n ...
- 贪心 Codeforces Round #301 (Div. 2) A. Combination Lock
题目传送门 /* 贪心水题:累加到目标数字的距离,两头找取最小值 */ #include <cstdio> #include <iostream> #include <a ...
随机推荐
- 富文本使用之wangEditor3
一.介绍: wangEditor —— 轻量级 web 富文本编辑器,配置方便,使用简单.支持 IE10+ 浏览器. 二.使用方式: 直接下载:https://github.com/wangfupen ...
- String.format字符串拼接
一.String.Format1.简介 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 2.参数 format()方法有两种重载形式. form ...
- PAT——1006. 换个格式输出整数
1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...
- C# 委托系列(一)将方法作为方法的参数
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...
- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
AwesomePlayer 中有个变量 OMXClient mClient; 让我们看看 OMXClient class OMXClient { public: OMXClient(); stat ...
- sharepoint2016安装OOS,OOS场负载均衡
Office Online Server is the successor to Office Web Apps Server. It may be connected to SharePoint, ...
- multiprocessing中进程池,线程池的使用
multiprocessing 多进程基本使用 示例代码1 import time import random from multiprocessing import Process def run( ...
- MySQL---数据表基本操作(增删改查、排序、分组、连表)
一.表操作 1.创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 是否可空,nul ...
- sass的嵌套
sass的嵌套包括两种: 1.选择器的嵌套.(最常用到) 指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性. 在选择器嵌套中,可以使用&表示父元素选择器 ...
- 【Android】添加依赖包
貌似好像不知一种方法,以后有时间再研究,下面是其中的一种方法