bzoj4395[Usaco2015 dec]Switching on the Lights

题意:

n*n个房间,奶牛初始在(1,1),且只能在亮的房间里活动。每当奶牛经过一个房间,就可以打开这个房间里控制其它房间灯的开关。问奶牛最多可点亮多少个房间。n≤100。

题解:

因为只要一个房间灯亮了,它将一直亮着,所以可以做bfs,每次由队列中的节点扩展可以到的节点。然而这样做不行,因为可能之前尝试过不能到达的房间的灯可以在之后到达的房间里被打开。解决方法是不停做bfs,直到答案不再更新。

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 110
using namespace std; inline int read(){
char ch=getchar(); int f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
struct nd{int x,y,n;}nds[maxn*]; int g[maxn][maxn];
int n,m,ans; bool lg[maxn][maxn],vis[maxn][maxn]; queue<pair<int,int> >q;
void bfs(int x,int y){
while(!q.empty())q.pop(); memset(vis,,sizeof(vis)); q.push(make_pair(x,y)); vis[x][y]=;
for(int i=g[x][y];i;i=nds[i].n)if(!lg[nds[i].x][nds[i].y])lg[nds[i].x][nds[i].y]=,ans++;
while(!q.empty()){
int nowx=q.front().first,nowy=q.front().second; q.pop();
if(nowx>&&lg[nowx-][nowy]&&!vis[nowx-][nowy]){
q.push(make_pair(nowx-,nowy)); vis[nowx-][nowy]=;
for(int i=g[nowx-][nowy];i;i=nds[i].n)
if(!lg[nds[i].x][nds[i].y])lg[nds[i].x][nds[i].y]=,ans++;
}
if(nowx<n&&lg[nowx+][nowy]&&!vis[nowx+][nowy]){
q.push(make_pair(nowx+,nowy)); vis[nowx+][nowy]=;
for(int i=g[nowx+][nowy];i;i=nds[i].n)
if(!lg[nds[i].x][nds[i].y])lg[nds[i].x][nds[i].y]=,ans++;
}
if(nowy>&&lg[nowx][nowy-]&&!vis[nowx][nowy-]){
q.push(make_pair(nowx,nowy-)); vis[nowx][nowy-]=;
for(int i=g[nowx][nowy-];i;i=nds[i].n)
if(!lg[nds[i].x][nds[i].y])lg[nds[i].x][nds[i].y]=,ans++;
}
if(nowy<n&&lg[nowx][nowy+]&&!vis[nowx][nowy+]){
q.push(make_pair(nowx,nowy+)); vis[nowx][nowy+]=;
for(int i=g[nowx][nowy+];i;i=nds[i].n)
if(!lg[nds[i].x][nds[i].y])lg[nds[i].x][nds[i].y]=,ans++;
}
}
}
int main(){
n=read(); m=read();
inc(i,,m){
int a=read(),b=read(),c=read(),d=read(); nds[i]=(nd){c,d,g[a][b]}; g[a][b]=i;
}
ans=; lg[][]=;
while(){int x=ans; bfs(,); if(ans==x)break;} printf("%d",ans); return ;
}

20160908

最新文章

  1. 基础才是重中之重~Emit动态构建方法(参数和返回值)
  2. python pyqt4 ide eric安装
  3. git恢复误删文件及省去密码提交
  4. [Android Pro] AAR and JAR
  5. UEditor去除复制样式实现无格式粘贴
  6. 作为平台的Windows PowerShell(二)
  7. php正则贪婪匹配与非贪婪匹配一些例子
  8. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像
  9. labview 调用 matlab script的神坑! Error 1050 occurred at LabVIEW
  10. 二叉树最大路径和-Binary Tree Maximum Path Sum
  11. java中Array/List/Map/Object与Json互相转换详解(转载)
  12. “ML学分计划”说明书
  13. HttpClient4登陆有验证码的网站
  14. 11GR2 Oracle数据库的远程投毒VNCR方式修复
  15. 《剑指offer》-旋转数组的最小数字
  16. gdb调试问题汇总
  17. 观实验室PPT演讲有感
  18. RRDtool运用
  19. Codeforces Round #350 (Div. 2) C. Cinema 水题
  20. Node.js实用知识点

热门文章

  1. filter()函数过滤序列
  2. C语言中main函数的参数argc和argv
  3. [转]IP地址和MAV地址——区别和联系
  4. JavaWeb的登陆与注销功能
  5. 面试题64:求 1 + 2 + ... + n
  6. vue-cli按装 和vue创建项目
  7. Python3-内置类型-集合类型
  8. ref和out的使用及区别
  9. 前端日常工作中常用开发小技巧 ---JavaScript
  10. 洛谷 P1314 【聪明的质监员】