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

 

posted @ 2016-07-05 20:45  czllgzmzl  阅读(207)  评论(0编辑  收藏  举报