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 }