Problem 洛谷P2845-Switching on the Lights 开关灯

Accept: 154    Submit: 499
Time Limit: 1000 mSec    Memory Limit : 128MB

Problem Description

Farm John 最近新建了一批巨大的牛棚。这些牛棚构成了一个N*N的矩形网络。(1<n<100)

然而bessie十分怕黑,他想计算可以把多少个牛棚的灯打开。

有N*N个房间,组成了一张N*N的网格图,Bessie一开始位于左上角(1,1),并且只能上下左右行走。

一开始,只有(1,1)这个房间的灯是亮着的,Bessie只能在亮着灯的房间里活动。

有另外M条信息,每条信息包含四个数a,b,c,d,表示房间(a,b)里有房间(c,d)的灯的开关。

请计算出最多有多少个房间的灯可以被打开。

 Input

第一行,两个数:N,M(1<m<200000);

第2-m+1行:坐标(x1,y1),(x2,y2)代表房间的坐标(x1,y1)及可以点亮的·房间的坐标(x2,y2);

 Output

一个数,最多可以点亮的房间数

 

 Sample Input

3 6
1 1 1 2
2 1 2 2
1 1 1 3
2 3 3 1
1 3 1 2
1 3 2 1

 Sample Output

5

题目链接:https://www.luogu.org/problemnew/show/P2845

题解:乍一看这个题觉得这个题咋这么水,凉了之后画了个稍微大一点图,意识到用普通的广搜的话,会有一些点会被误判为不能到的点而只是点亮而不进队,这样就很明显有问题了。

解决方案其实挺好想的,把原来的vis数组变成vis和illu数组,前者用来标记到过没有,后者标记点亮没有,新到一个房间,有一些它能打开的灯,对于这些点,判断它的四周有没有之前到过的点,

如果有,那它也能到,入队。当然了,判断当前房间四周有没有开灯是必然的。

 #include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std; const int maxn = +,maxm = +; bool vis[maxn][maxn];
bool illu[maxn][maxn];
int n,m;
int tot,head[maxn*maxn];
int dir[][] = {{,},{,},{-,},{,-}}; struct Point{
int x,y;
Point(int x = ,int y = ) :
x(x),y(y) {}
}; struct Edge{
int to,next;
Edge(int to = ,int next = ) :
to(to),next(next) {}
}edge[maxm]; void AddEdge(int u,int v){
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}; inline void cal(int v,int &x,int &y){
if(v%n == ){
x = v/n,y = n;
}
else x = v/n+,y = v%n;
} inline bool Judge(int x,int y){
if(<=x && <=y && x<=n && y<=n) return true;
return false;
} void BFS(){
queue<Point> que;
que.push(Point(,));
vis[][] = illu[][] = true;
while(!que.empty()){
Point first = que.front();
que.pop();
int u = (first.x-)*n+first.y;
for(int k = ;k < ;k++){
int xx = first.x+dir[k][],yy = first.y+dir[k][];
if(Judge(xx,yy)){
if(!vis[xx][yy] && illu[xx][yy]){
vis[xx][yy] = true;
que.push(Point(xx,yy));
}
}
}
for(int i = head[u];i != -;i = edge[i].next){
int v = edge[i].to;
int x,y;
cal(v,x,y);
illu[x][y] = true;
if(!vis[x][y]){
for(int k = ;k < ;k++){
int xx = x+dir[k][],yy = y+dir[k][];
if(Judge(xx,yy) && vis[xx][yy]){
vis[x][y] = true;
que.push(Point(x,y));
}
}
}
}
}
} int main()
{
//freopen("input.txt","r",stdin);
memset(vis,false,sizeof(vis));
memset(illu,false,sizeof(illu));
memset(head,-,sizeof(head));
tot = ;
scanf("%d%d",&n,&m);
int a,b,c,d;
for(int i = ;i <= m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
int u = (a-)*n+b,v = (c-)*n+d;
AddEdge(u,v);
}
BFS();
int ans = ;
for(int i = ;i <= n;i++){
for(int j = ;j <= n;j++){
if(illu[i][j]) ans++;
}
}
printf("%d\n",ans);
return ;
}

洛谷P2845-Switching on the Lights 开关灯的更多相关文章

  1. 洛谷P2828 Switching on the Lights(开关灯)

    P2828 Switching on the Lights(开关灯) 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一个N*N的矩形网络.( ...

  2. 洛谷 P2828 Switching on the Lights(开关灯)

    传送门 题目大意:n*n的网格,每个网格是一个房间 都关着灯,只有(1,1)开着灯,且(x,y)有着(z,k)房间灯的开关. 问从(1,1)开始走最多点开几盏灯. 题解:搜索+骗分. 劳资的骗分天下无 ...

  3. 搜索【洛谷P2845】 [USACO15DEC]Switching on the Lights 开关灯

    P2845 [USACO15DEC]Switching on the Lights 开关灯 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一 ...

  4. Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)

    P2845 [USACO15DEC]Switching on the Lights 开关灯 题意 题目背景 来源:usaco-2015-dec \(Farm\ John\)最近新建了一批巨大的牛棚.这 ...

  5. P2845 [USACO15DEC]Switching on the Lights 开关灯

    题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一个N*N的矩形网络.(1<n<100) 然而bessie十分怕黑,他想计算可以把 ...

  6. 「Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯」

    USACO的又一道搜索题 前置芝士 BFS(DFS)遍历:用来搜索.(因为BFS好写,本文以BFS为准还不是因为作者懒) 链式前向星,本题的数据比较水,所以邻接表也可以写,但是链式前向星它不香吗. 具 ...

  7. COCI2017-2018#3 Dojave || 洛谷P4443

    题目传送门............................................................................................... ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. nginx配置虚拟机

    在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件. 一.通过端口号区分虚拟机 在nginx.conf文件中添加一个Service节点,修改端口号: se ...

  2. JavaScript黑客是这样窃取比特币的,Vue开发者不用担心!

    如果你是JavaScript或者区块链开发者,如果你有关注区块链以及比特币,那么你应该听说了比特币钱包Copay被黑客攻击的事情.但是,你知道这是怎么回事吗? 总结 比特币钱包copay依赖event ...

  3. qW3xT.2,解决挖矿病毒。

    网站在运行期间感觉怪怪的,响应速度慢的不是一丁半点,带宽5M,不该是这样的呀 于是登录Xshell top命令 查看cpu情况如下 PID为3435的进程占用CPU过大,难道被病毒入侵了吗? 查看该进 ...

  4. 6;XHTML 超链接

    1.超链接的基本格式 2.超链接的种类 3.相对链接和绝对链接 4.书签的链接 5.基准参考点 6.超链接事件 7.为链接创建键盘快捷键 8.为链接设置制表符次序 超链接也叫 URL 中文翻译为资源定 ...

  5. JAVA 多线程(2)

    一.首先 Thread 是实现了Runable 接口的类 理论上Thread 实例与直接实现runable接口的实例运行起来没有什么不同,但是由于JAVA 是单继承,所以如果想再一个类中实现2个不同的 ...

  6. php通过某个日期段的周几,获取选中周几对应的日期

    最近在做课程表的项目里用到了这个,有个日期段,选择好周几之后,想获取在这个日期段内选中的星期对应的日期,如下图,代码如下 function getDateByWeek($data) { $start_ ...

  7. wamp安装运行时出现服务未启动

    安装wamp时,弹出对话框:Aestan Tray Menu Could not execute menu item (internal error )[Exception]could not ser ...

  8. mybatis 中 使用 allowMultiQueries=true

    单条的数据进行修改或者插入的时候没问题,但是进行批量操作的时候就会出现错误,是因为没有开启支持批量操作的功能. mybatis支持批量操作 开启批量执行sql的开关,在拼装mysql链接的url时,为 ...

  9. Android为TV端助力 事件分发机制

    android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...

  10. <自动化测试方案_6>第六章、API自动化测试

    第六章.API自动化测试 (一)工具实现 目前大众接口测试的工具有:Postman.SoupUI.jmeter他们的特点介绍有人做个宏观的研究,这里进行引用:https://blog.csdn.net ...