USACO的又一道搜索题

前置芝士

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

具体做法

对于一个点,它可能有不止一个房间,虽然可以开一个\([x_1][y_1][x_2][y_2]\)的邻接矩阵,但是每次查询时需要\(\theta(N^2)\)枚举,十分的麻烦,还可能会T,这时就需要用到链式前向星来优化了,不仅优化了时间,还优化了空间,简直一举两得.这里的链式前向星的写法也很简单:

代码

  1. struct Edge//定义一个结构体
  2. {
  3. int next;
  4. int x,y;
  5. }edge[maxM];
  6. int cnt=0;
  7. int _head[maxN][maxN];
  8. void Add(Room a,Room b)//在房间a和房间b间添加一条边
  9. {
  10. edge[++cnt].x=b.x;
  11. edge[cnt].y=b.y;
  12. edge[cnt].next=_head[a.x][a.y];
  13. _head[a.x][a.y]=cnt;
  14. }
  15. //一时define一时爽,一直define一直爽
  16. #define For(x,y) for(int _i_=_head[x][y];_i_;_i_=edge[_i_].next)
  17. #define X edge[_i_].x
  18. #define Y edge[_i_].y

对于每个点它只会进一次队列,但是如果那时它的灯没有打开,不代表这个灯永远不会被打开,所以在每进入一个房间后需要判断被打开灯的房间是否被询问过,如果被询问过需要将这个点放入队列.

注意输出的是有多少个房间的灯可以被打开.

有一些具体的细节讲.

代码

  1. #include<bits/stdc++.h>
  2. #define rap(i,first,last) for(int i=first;i<=last;++i)
  3. using namespace std;
  4. const int maxN=105;
  5. const int maxM=1e6+5;
  6. const int move_x[5]={233,1,-1,0,0};
  7. const int move_y[5]={233,0,0,1,-1};
  8. int head=0,tail=1;
  9. bool visit[maxN][maxN];
  10. struct Que//队列
  11. {
  12. int x;
  13. int y;
  14. }que[maxN*maxN];//队列里最多N^2个房间,每个房间只会进一次
  15. int N,M;
  16. struct Room//对于房间再开一个结构体
  17. {
  18. int x,y;
  19. };
  20. //链式前向星
  21. struct Edge
  22. {
  23. int next;
  24. int x,y;
  25. }edge[maxM];
  26. int cnt=0;
  27. int _head[maxN][maxN];
  28. bool opened[maxN][maxN];
  29. void Add(Room a,Room b)
  30. {
  31. edge[++cnt].x=b.x;
  32. edge[cnt].y=b.y;
  33. edge[cnt].next=_head[a.x][a.y];
  34. _head[a.x][a.y]=cnt;
  35. }
  36. int answer=1;
  37. #define For(x,y) for(int _i_=_head[x][y];_i_;_i_=edge[_i_].next)
  38. #define X edge[_i_].x
  39. #define Y edge[_i_].y
  40. //
  41. void Open(int x,int y)//打开一个房间的开关
  42. {
  43. For(x,y)
  44. if(!opened[X][Y])//注意要有这个特判
  45. {
  46. opened[X][Y]=1;
  47. answer++;//每打开一个灯answer++
  48. if(visit[X][Y])//如果询问过就放入队列
  49. {
  50. que[++tail].x=X;
  51. que[tail].y=Y;
  52. }
  53. }
  54. }
  55. int main()
  56. {
  57. scanf("%d%d",&N,&M);
  58. Room room1,room2;
  59. rap(i,1,M)
  60. {
  61. scanf("%d%d%d%d",&room1.x,&room1.y,&room2.x,&room2.y);
  62. Add(room1,room2);//添加一条边
  63. }
  64. rap(i,1,N)visit[i][0]=visit[0][i]=visit[N+1][i]=visit[i][N+1]=1;//在四周打上标记
  65. que[1].x=1;
  66. que[1].y=1;
  67. opened[1][1]=1;
  68. while(++head<=tail)
  69. {
  70. Open(que[head].x,que[head].y);//在队头时打开比较方便,不会有遗漏
  71. rap(i,1,4)
  72. if(opened[que[head].x+move_x[i]][que[head].y+move_y[i]])//如果这个位置的灯被打开了
  73. {
  74. if(!visit[que[head].x+move_x[i]][que[head].y+move_y[i]])//没有询问过就放入队列
  75. {
  76. visit[que[head].x+move_x[i]][que[head].y+move_y[i]]=1;
  77. que[++tail].x=que[head].x+move_x[i];
  78. que[tail].y=que[head].y+move_y[i];
  79. }
  80. }
  81. else
  82. {
  83. visit[que[head].x+move_x[i]][que[head].y+move_y[i]]=1;//没有被打开也要标记为询问过
  84. }
  85. }
  86. printf("%d",answer);//输出answer
  87. return 0;
  88. }

「Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯」的更多相关文章

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

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

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

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

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

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

  4. 「Luogu P5494 【模板】线段树分裂」

    (因为没有认证,所以这道题就由Froggy上传) 线段树分裂用到的地方确实并不多,luogu上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一些其他的算法水过去. ...

  5. [Luogu 3128] USACO15DEC Max Flow

    [Luogu 3128] USACO15DEC Max Flow 最近跟 LCA 干上了- 树剖好啊,我再也不想写倍增了. 以及似乎成功转成了空格选手 qwq. 对于每两个点 S and T,求一下 ...

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

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

  7. bzoj4395[Usaco2015 dec]Switching on the Lights*

    bzoj4395[Usaco2015 dec]Switching on the Lights 题意: n*n个房间,奶牛初始在(1,1),且只能在亮的房间里活动.每当奶牛经过一个房间,就可以打开这个房 ...

  8. 洛谷P2845-Switching on the Lights 开关灯

    Problem 洛谷P2845-Switching on the Lights 开关灯 Accept: 154    Submit: 499Time Limit: 1000 mSec    Memor ...

  9. FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...

随机推荐

  1. 【Go语言系列】1.4、GO语言简介:第一个Go语言程序

    接下来我们来编写第一个 Go 程序 hello.go(Go 语言源文件的扩展是 .go),代码如下: // 声明 main 包 package main import ( "fmt" ...

  2. xshell 快捷键总结

    ##快捷键 linux tab == 命令补全,路径补全.如果tab不到,就代表对于当前用户环境系统找不到这个目录或者路径,有可能有,但是没有放在PATH中 ctrl + a == a:26个字母的第 ...

  3. [Thiinking in Java]自闭学习之路(一)构造器

    前言- 本文是为个人学习做的整理性质的笔记,肯定带有许多不妥的地方,仅供参考. (第五章·初始化与清理 <Thinking in Java>) 用构造器确保初始化 正文- 构造器: 什么是 ...

  4. 使用$.ajax时的注意事项

    做PHP难免接触js,我也是这样,使用ajax的时候,我比较习惯使用$.ajax({}),这种方式,因为通用性较强.有时候会较少使用js,隔一段时间后再使用,有些细节内容容易模糊不清,这一次,我又忘记 ...

  5. python opencv:图像的一些属性与操作

    img = cv.imread(xxx) # 常用的有以下属性 type(img) # img的数据类型 img.shape # img的结构 img.size # img的大小 img.dtype ...

  6. PowerDesigner每点击一次就会提示打印错误对话框

    把服务启用了就好了: 重启软件

  7. 【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案

    前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的. ...

  8. 获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

    public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 获取Clas ...

  9. IPSec的链路和设备备份

    链路备份的IPSec VPN和设备备份的IPSec VPN:首先实验的是链路备份的  IPSec VPN,下面是实验拓扑: IP地址配置:R1(Branch):Branch(config-if)#ip ...

  10. Mac 如何导出ipa文件中Assets.car包中的切图

    在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...