题意与分析(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)的更多相关文章

  1. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  2. 「日常训练」Queue(Codeforces Round 303 Div.2 D)

    简单到让人不敢相信是D题,但是还是疏忽了一点. 题意与分析 (Codeforces 545D) 题意:n人排队,当一个人排队的时间超过他需要服务的时间就会厌烦,现在要求一个最优排列使得厌烦的人最少. ...

  3. 「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)

    这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x ...

  4. 「日常训练」Skills(Codeforce Round #339 Div.2 D)

    题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...

  5. 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)

    题意与分析(Codeforces-431C) 题意是这样的:给出K-Tree--一个无限增长的树,它的每个结点都恰有\(K\)个孩子,每个节点到它\(K\)个孩子的\(K\)条边的权重各为\(1,2, ...

  6. 「专题训练」Boredom(CodeForces Round #260 Div.1 A)

    题意(Codeforces-455A) 给你\(n\)个数,你每次可以选择删除去一个数\(x\)获得\(x\)分,但是所有为\(x+1\)和\(x-1\)的数都得删去.问最大获得分数. 分析 这是一条 ...

  7. DFS/BFS Codeforces Round #301 (Div. 2) C. Ice Cave

    题目传送门 /* 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. 若两 ...

  8. 贪心 Codeforces Round #301 (Div. 2) B. School Marks

    题目传送门 /* 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 num1是输出的1的个数,numy是除此之外的数都为y,此时的n ...

  9. 贪心 Codeforces Round #301 (Div. 2) A. Combination Lock

    题目传送门 /* 贪心水题:累加到目标数字的距离,两头找取最小值 */ #include <cstdio> #include <iostream> #include <a ...

随机推荐

  1. 富文本使用之wangEditor3

    一.介绍: wangEditor —— 轻量级 web 富文本编辑器,配置方便,使用简单.支持 IE10+ 浏览器. 二.使用方式: 直接下载:https://github.com/wangfupen ...

  2. String.format字符串拼接

    一.String.Format1.简介      String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 2.参数      format()方法有两种重载形式. form ...

  3. PAT——1006. 换个格式输出整数

    1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...

  4. C# 委托系列(一)将方法作为方法的参数

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  5. android中OpenMax的实现【2】AwesomePlayer中openmax的入口

    AwesomePlayer 中有个变量 OMXClient mClient; 让我们看看   OMXClient class OMXClient { public: OMXClient(); stat ...

  6. sharepoint2016安装OOS,OOS场负载均衡

    Office Online Server is the successor to Office Web Apps Server. It may be connected to SharePoint, ...

  7. multiprocessing中进程池,线程池的使用

    multiprocessing 多进程基本使用 示例代码1 import time import random from multiprocessing import Process def run( ...

  8. MySQL---数据表基本操作(增删改查、排序、分组、连表)

    一.表操作 1.创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 是否可空,nul ...

  9. sass的嵌套

    sass的嵌套包括两种: 1.选择器的嵌套.(最常用到) 指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性. 在选择器嵌套中,可以使用&表示父元素选择器 ...

  10. 【Android】添加依赖包

    貌似好像不知一种方法,以后有时间再研究,下面是其中的一种方法