p2411_枚举.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 61 行

CPP
61
字号
#include <stdio.h>
#include <string.h>

const    int      dx [4] = { -1 , 0 , 1 , 0 };
const    int      dy [4] = { 0 , -1 , 0 , 1 };

int      N , M , map [102] [102];
bool     Fill [102] [102];

bool     range ( int x , int y )
{
         return x >= 0 && x <= N + 1 && y >= 0 && y <= M + 1;
}

bool     check ( int x1 , int y1 , int x2 , int y2 )
{
         if ( x1 == x2 && y1 == y2 ) return false;
         if ( map [x1] [y1] == 0 || map [x1] [y1] != map [x2] [y2] ) return false;
         
         memset ( Fill , 0 , sizeof ( Fill ));
         int    x , y , px , py , face;
         
         Fill [x1] [y1] = true;
         for ( int i = 0; i < 4; i ++ ) {
             for ( x = x1 + dx [i] , y = y1 + dy [i]; range ( x , y ) && map [x] [y] == 0; x += dx [i] , y += dy [i] )
                 Fill [x] [y] = true;
             if ( x == x2 && y == y2 ) return true;
         }

         for ( int i = 0; i < 4; i ++ )
             for ( x = x2 + dx [i] , y = y2 + dy [i]; range ( x , y ) && map [x] [y] == 0; x += dx [i] , y += dy [i] ) {
                 if ( Fill [x] [y] ) return true;
                 for ( face = ( i + 1 ) % 4 , px = x + dx [face] , py = y + dy [face]; range ( px , py ); px += dx [face] , py += dy [face] ) {
                     if ( Fill [px] [py] ) return true;
                     if ( map [px] [py] ) break;
                 }
                 for ( face = ( i + 3 ) % 4 , px = x + dx [face] , py = y + dy [face]; range ( px , py ); px += dx [face] , py += dy [face] ) {
                     if ( Fill [px] [py] ) return true;
                     if ( map [px] [py] ) break;
                 }
             }
         return false;
}

main ()
{
     while ( scanf ( "%d%d" , &N , &M ) , N || M ) {
           memset ( map , 0 , sizeof ( map ));
           for ( int i = 1; i <= N; i ++ )
               for ( int j = 1; j <= M; j ++ ) 
                   scanf ( "%d" , &map [i] [j] );
                   
           int     Q , x1 , y1 , x2 , y2 , Ans = 0;
           for ( scanf ( "%d" , &Q ); Q ; Q -- ) {
               scanf ( "%d%d%d%d" , &x1 , &y1 , &x2 , &y2 );
               if ( check ( x1 , y1 , x2 , y2 ) ) Ans ++ , map [x1] [y1] = map [x2] [y2] = 0;
           }
           printf ( "%d\n" , Ans * 2 );
     }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?