现在的位置: 首页 > 综合 > 正文

ZOJ 2411 Link Link Look

2019年04月15日 ⁄ 综合 ⁄ 共 2840字 ⁄ 字号 评论关闭

第一次写连连看的题目,居然写了一个下午。空格需要采用并查集的方式处理,把相连空格合并。顺便说一句,这题目真是无语。

 

#include <cstdio>
#include 
<string>

#define MAX 102

int spc[MAX][MAX], spr[MAX][MAX], a[MAX][MAX], N, M, T, ans;

int init ()
{
    scanf ( 
"%d%d"&N, &M );
    
if ( !N )
    
{
        
return 0;
    }

    
int i, j;
    memset ( a, 
0sizeof ( a ) );
    
for ( i = 1; i <= N; i ++ )
    
{
        
for ( j = 1; j <= M; j ++ )
        
{
            scanf ( 
"%d"&a[i][j] );
        }

    }

    scanf ( 
"%d"&T );
    memset ( spc, 
0xffsizeof ( spc ) );
    memset ( spr, 
0xffsizeof ( spr ) );
    
for ( i = 0; i <= MAX; i ++ )
        spc[i][
0= spc[0][i] = 0;
    
for ( j = 0; j <= MAX; j ++ )
        spr[
0][j] = spr[j][0= 0;
    
for ( i = 1; i <= N + 1; i ++ )
    
{
        
for ( j = 1; j <= M + 1; j ++ )
        
{
            
if ( a[i][j] )
                
continue;
            spr[i][j] 
= a[i][j - 1? j : spr[i][j - 1];
            spc[i][j] 
= a[i - 1][j] ? i : spc[i - 1][j];
        }

    }

    
return 1;
}


int cempty ( int c, int t0, int t1 )
{
    
return ( spc[t0][c] == spc[t1][c] && spc[t0][c] != -1 );
}


int rempty ( int r, int t0, int t1 )
{
    
return ( spr[r][t0] == spr[r][t1] && spr[r][t0] != -1 );
}


void update ( int x, int y )
{
    
int i, j;
    
if ( a[x][y] )
        spc[x][y] 
= spr[x][y] = -1;
    
else
    
{
        spc[x][y] 
= a[x - 1][y] ? x : spc[x - 1][y];
        spr[x][y] 
= a[x][y - 1? y : spr[x][y - 1];
    }

    
for ( i = x + 1; i <= N + 1; i ++ )
    
{
        
if ( a[i][y] )
            
break;
        spc[i][y] 
= a[i - 1][y] ? i : spc[i - 1][y];
    }

    
for ( j = y + 1; j <= M + 1; j ++ )
    
{
        
if ( a[x][j] )
            
break;
        spr[x][j] 
= a[x][j - 1? j : spr[x][j - 1];
    }

}


int search ( int x1, int y1, int x2, int y2 )
{
    
if ( x1 > N || x1 <1 || x2> N || x2 <1 || y1> M || y2 <1 || y2> M || y2 < 1 )
        
return 0;
    
if ( x1 == x2 && y1 == y2 )
        
return 0;
    
if ( a[x1][y1] != a[x2][y2] )
        
return 0;
    
if ( a[x1][y1] == 0 )
        
return 0;
    
int i, j, t;
    t 
= a[x1][y1];
    a[x1][y1] 
= a[x2][y2] = 0;
    update ( x1, y1 );
    update ( x2, y2 );
    
//pt ();
    for ( j = 0; j <= M + 1; j ++ )
    
{
        
if ( rempty ( x1, j, y1 ) && rempty ( x2, j, y2 ) && cempty ( j, x1, x2 ) )
            
return 1;
    }

    
for ( i = 0; i <= N + 1; i ++ )
    
{
        
if ( cempty ( y1, i, x1 ) && cempty ( y2, i, x2 ) && rempty ( i, y1, y2 ) )
            
return 1;
    }

    a[x1][y1] 
= a[x2][y2] = t;
    update ( x1, y1 );
    update ( x2, y2 );
    
//pt ();
    return 0;
}


void query ()
{
    
int i, x1, y1, x2, y2;
    ans 
= 0;
    
for ( i = 0; i < T; i ++ )
    
{
        scanf ( 
"%d%d%d%d"&x1, &y1, &x2, &y2 );
        
if ( search ( x1, y1, x2, y2 ) )
            ans 
+= 2;
    }

    printf ( 
"%d ", ans );
}


int main ()
{
    
//freopen ( "in.txt", "r", stdin );
    while ( init () )
    
{
        query ();
    }

    
return 0;
}

抱歉!评论已关闭.