4395: [Usaco2015 dec]Switching on the Lights

  每次到达一个点,或者点亮一个房间的灯的时候,检查一下它四周的点能否走。

  一开始看错题了..要求的是最多能开多少房的灯。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=10023;
 8 const int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
 9 struct zs{int too,pre;}e[20012];int tot,last[maxn];
10 int dlx[maxn],dly[maxn];
11 int id[103][103],X[maxn],Y[maxn];
12 bool con[103][103],can[103][103];
13 int i,j,k,n,m,l,r;
14 int ans;
15   
16 int ra;char rx;
17 inline int read(){
18     rx=getchar(),ra=0;
19     while(rx<'0'||rx>'9')rx=getchar();
20     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
21 }
22 inline void insert(int a,int b){e[++tot].too=b,e[tot].pre=last[a],last[a]=tot;}
23 inline void run(int nx,int ny){
24     int x,y;
25     for(int i=0;i<4;i++){
26         x=nx+xx[i],y=ny+yy[i];
27         if(x<1||y<1||x>n||y>n)continue;
28         if(!con[x][y]&&can[x][y])r++,dlx[r]=x,dly[r]=y;
29         con[x][y]=1;
30     }
31 }
32 int main(){
33     n=read(),m=read();int a,b,c,d,cnt=0;
34     for(i=1;i<=n;i++)for(j=1;j<=n;j++)id[i][j]=++cnt,X[cnt]=i,Y[cnt]=j;
35     for(i=1;i<=m;i++)a=read(),b=read(),c=read(),d=read(),insert(id[a][b],id[c][d]);
36     l=0,r=1;
37     dlx[1]=dly[1]=con[1][1]=can[1][1]=1;
38     while(l<r){
39         l++;
40         for(i=last[id[dlx[l]][dly[l]]];i;i=e[i].pre){
41             if(!can[X[e[i].too]][Y[e[i].too]]&&con[X[e[i].too]][Y[e[i].too]])
42                 r++,dlx[r]=X[e[i].too],dly[r]=Y[e[i].too];
43             can[X[e[i].too]][Y[e[i].too]]=1;
44         }
45         run(dlx[l],dly[l]);
46     }
47     for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(can[i][j])ans++;
48     printf("%d\n",ans);
49 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5644979.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值