这里有普通的深度搜索就可以了,只是普通的深度搜索用的是Hash存放是否存在,我们却用有序表来代表。 要注意的是,有序表可以用二分搜索来实现动态搜索,只是只能局限于动态删除,不能实现动态插入 因为恐怕会有爆栈情况,所以用了非递归来实现。 #include <cstdio> #include <algorithm> #include <functional> using namespace std; const int MAX = 17000; typedef struct _Node { int x ,y; }Node; typedef struct _SN { Node data; int cur; }SN; Node data[MAX]; SN stack[30000]; bool exist[MAX]; int result[MAX]; int total; int n; bool cmp( const Node& left , const Node & right ) { if( left.x != right.x ) return left.x < right.x ; else return left.y < right.y ; } int binarysearch( int left , int right , const Node& mid ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( data[middle].x == mid.x && data[middle].y == mid.y ) { if( exist[middle] == false ) return middle; else return -1; } else if( cmp( data[middle] , mid ) ) left = middle + 1; else right = middle - 1 ; } return -1; } bool getnext( const Node& left , Node& right , int step ) { static const int x[4] = {0,0,1,-1}; static const int y[4] = {-1,1,0,0}; right.x = left.x + x[step]; right.y = left.y + y[step]; int finder = binarysearch( 0 , n - 1 , right ); if( finder == -1 ) return false; else { exist[finder] = true; return true; } } void find( Node& left ) { //++total; //Node mid; //for( int i = 0 ; i != 4 ; ++i ) // if( getnext( left , mid , i ) ) // find( mid ); int stacki = 0 ; int i; Node mid,mid2; stack[ stacki ].data = left; stack[ stacki ].cur = 0 ; while( stacki >= 0 ) { mid2 = stack[ stacki ].data; i = stack[ stacki ].cur; --stacki; if( i == 0 ) ++total; for( ; i < 4 ; ++i ) if( getnext( mid2 , mid , i )) { ++stacki; stack[ stacki ].data = mid2; stack[ stacki ].cur = i + 1; ++stacki; stack[ stacki ].data = mid; stack[ stacki ].cur = 0; break; } } } int main() { int k,max,sum; scanf("%d%d",&n,&max); for( int i = 0 ; i != n ; ++i ) scanf("%d%d",&data[i].x , &data[i].y ); sort( &data[0] , &data[n] , cmp ); k = 0 ; for( int i = 0 ; i != n ; ++i ) if( exist[i] == false ) { exist[i] = true; total = 0 ; find( data[i] ); result[k++] = total; } sort(&result[0] , &result[k] , greater<int>() ); sum = 0 ; for( int i = 0 ; i != max ; ++i ) sum += result[i]; printf("%d/n",sum); return 0; }