第一次写连连看的题目,居然写了一个下午。空格需要采用并查集的方式处理,把相连空格合并。顺便说一句,这题目真是无语。
#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, 0, sizeof ( a ) );
for ( i = 1; i <= N; i ++ )
...{
for ( j = 1; j <= M; j ++ )
...{
scanf ( "%d", &a[i][j] );
}
}
scanf ( "%d", &T );
memset ( spc, 0xff, sizeof ( spc ) );
memset ( spr, 0xff, sizeof ( 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;
}
#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, 0, sizeof ( a ) );
for ( i = 1; i <= N; i ++ )
...{
for ( j = 1; j <= M; j ++ )
...{
scanf ( "%d", &a[i][j] );
}
}
scanf ( "%d", &T );
memset ( spc, 0xff, sizeof ( spc ) );
memset ( spr, 0xff, sizeof ( 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;
}