补上以前没有AC的PKU儿八死三

额。。。DFS会RE。。。

#include <stdio.h>
#include
<string.h>


int mmm[1024][1024];
int rj[1024][1024];

int cnt, N, M, i1, j1, i2, j2;


int q[1024*1024][2];
const int dx[4= {10-10};
const int dy[4= {010-1};

void BFS(int i, int j)
{
    mmm[i][j]
=1;
    
int front, rear, k;
    q[
0][0= i;
    q[
0][1= j;
    
for(front = 0, rear = 1; front < rear; front++)
        
for(k = 0; k < 4; k++)
        
{
            i 
= q[front][0+ dx[k];
            j 
= q[front][1+ dy[k];
            
if((i>=i1 && i<=i2  &&  j>=j1 && j<=j2) && mmm[i][j]==0)
            
{
                mmm[i][j] 
= 1;
                q[rear][
0= i;
                q[rear
++][1= j;
            }

        }

}



/*
void DFS(int i, int j)
{
    mmm[i][j]=1;
    if(i + 1 <= i2 && mmm[i + 1][j] == 0)
        DFS(i + 1, j);
    if(i - 1 >= i1 && mmm[i - 1][j] == 0)
        DFS(i - 1, j);
    if(j + 1 <= j2 && mmm[i][j + 1] == 0)
        DFS(i, j + 1);
    if(j - 1 >= j1 && mmm[i][j - 1] == 0)
        DFS(i, j - 1);
}
*/



void gra()
{
    
for(int ii = i1; ii <= i2; ii++ )
    
{
        
int jj = j1;
        
while( jj <= j2 )
        
{
            
while(rj[ii][jj] > 0)
            
{
                jj 
= rj[ii][jj];
                
if(jj > j2)
                    
break;
            }

            
if(jj > j2)
                
break;
            
if( mmm[ii][jj] == 0 )
            
{
                
//DFS(ii, jj);
                BFS(ii, jj);
                cnt
++;
            }

            jj
++;
        }

    }

}



int main()
{

    scanf(
"%d%d"&N, &M);
    
        
for(int i = 0; i < M; i++ )
        
{
            cnt 
= 0;
            scanf(
"%d%d%d%d"&i1, &j1, &i2, &j2);

            
if(j1 > N) j1 = N;
            
if(j2 > N) j2 = N;
            gra();
            
for(int ci = i1; ci <= i2; ci ++)
            
{
                
if(rj[ci][j1] < j2+1)
                    rj[ci][j1] 
= j2+1;
            }

            printf(
"%d\n", cnt);
        }


    
return 0;
}


原文地址:https://www.cnblogs.com/SQL/p/897785.html