写得比较乱,以后再改吧,要注意做的时候,坐标系的确定方式。 #include<cstdio> #include <algorithm> using namespace std; typedef struct _Node { int row , col,index; }Node; typedef struct _Node2 { Node begin; Node end; int length; char direction; }Node2; const int MAX = 250010; Node data[MAX]; Node dataRow[MAX]; Node dataCol[MAX]; char buffer[MAX]; int n; bool cmp1( const Node& left , const Node & right ) { if( left.row != right.row ) return left.row < right.row ; else return left.col < right.col; } bool cmp2( const Node& left , const Node& right ) { if( left.col != right.col ) return left.col < right.col; else return left.row < right.row ; } int binarysearchrow( int left , int right , const Node& key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( dataRow[middle].row == key.row && dataRow[middle].col == key.col ) return middle; else if( cmp1( dataRow[middle] , key ) ) left = middle + 1 ; else right = middle - 1 ; } return -1; } int binarysearchcol( int left , int right , const Node& key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( dataCol[middle].row == key.row && dataCol[middle].col == key.col ) return middle; else if( cmp2( dataCol[middle] , key ) ) left = middle + 1 ; else right = middle - 1 ; } return -1; } int Abs( int left ) { if( left >= 0 ) return left; else return -left; } void getnext( const Node& mid , Node2& result ) { Node2 max; int left,right; max.begin = mid; max.length = 100000000;max.end.index = -1; left = binarysearchrow( 0 , n - 1 , mid ); if( left - 1 >= 0 && dataRow[left-1].row == mid.row && Abs( dataRow[left-1].index - mid.index ) > 1 ) { if( mid.col - dataRow[left-1].col < max.length || ( mid.col - dataRow[left-1].col == max.length && dataRow[left-1].index > max.end.index ) ) { max.end = dataRow[ left - 1 ]; max.direction = 'W'; max.length = mid.col - dataRow[left-1].col; } } if( left + 1 < n && dataRow[left+1].row == mid.row && Abs( dataRow[left+1].index - mid.index ) > 1 ) { if( dataRow[left+1].col - mid.col < max.length || ( dataRow[left+1].col - mid.col == max.length && dataRow[left+1].index > max.end.index ) ) { max.end = dataRow[ left + 1 ]; max.direction = 'E'; max.length = dataRow[left+1].col - mid.col ; } } right = binarysearchcol( 0 , n - 1 , mid ); if( right - 1 >= 0 && dataCol[right-1].col == mid.col && Abs( dataCol[right-1].index - mid.index ) > 1 ) { if( mid.row - dataCol[right-1].row < max.length || ( mid.row - dataCol[right-1].row == max.length && dataCol[right-1].index > max.end.index ) ) { max.end = dataCol[ right - 1 ]; max.direction = 'S'; max.length = mid.row - dataCol[right-1].row; } } if( right + 1 < n && dataCol[right+1].col == mid.col && Abs( dataCol[right+1].index - mid.index ) > 1 ) { if( dataCol[right+1].row - mid.row < max.length || ( dataCol[right+1].row - mid.row == max.length && dataCol[right+1].index > max.end.index ) ) { max.end = dataCol[ right + 1 ]; max.direction = 'N'; max.length = dataCol[right+1].row - mid.row; } } result = max; } int main() { scanf("%d%s",&n,buffer); //++n; data[0].row = data[0].col = data[0].index = 0 ; for( int i = 0 ; i < n ; ++i ) if( buffer[i] == 'N') { data[i+1].row = data[i].row + 1 ; data[i+1].col = data[i].col ; data[i+1].index = data[i].index + 1 ; } else if( buffer[i] == 'S' ) { data[i+1].row = data[i].row - 1 ; data[i+1].col = data[i].col ; data[i+1].index = data[i].index + 1 ; } else if( buffer[i] == 'E' ) { data[i+1].row = data[i].row ; data[i+1].col = data[i].col + 1 ; data[i+1].index = data[i].index + 1 ; } else { data[i+1].row = data[i].row ; data[i+1].col = data[i].col - 1 ; data[i+1].index = data[i].index + 1 ; } ++n; for( int i = 0 ; i != n ; ++i ) dataRow[i] = dataCol[i] = data[i]; sort( &dataRow[0] , &dataRow[n] , cmp1 ); sort( &dataCol[0] , &dataCol[n] , cmp2 ); Node2 result,mid; result.end.index = -1; result.length = 100000000; for( int i = 0 ; i < n - 1 ; ++i ) { getnext( data[i] , mid ); if( mid.length < result.length ) result = mid; } printf("%d %d %d %c",result.length , result.begin.index , result.end.index , result.direction ); return 0; }