首页 > 代码库 > hdu--5128--计算几何<算不上.暴力模拟> && hdu--5131--初级cmp

hdu--5128--计算几何<算不上.暴力模拟> && hdu--5131--初级cmp

首先 给你N个点的坐标 你要找出其中的4个点来构造矩形

可以选择4个点 或者 一条对角线来进行构造

4个点 需要写个4层for  对角线只要2层for相比下 还是对角线比较好

虽然 我们会重复构造相同的矩形出来 但是没关系 题目数据很小的

接下来 就是矩形是否相交的判断了

注意一种特殊情况 矩阵 I 内含与 矩阵 J 或者是矩阵 j 内含i的含 就是得到外面的矩阵的面积

 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4  5 int n , cnt; 6 const int size = 35; 7 struct data 8 { 9     int x , y;10     int minX , minY , maxX , maxY , area;11 }node[size],mat[size];12 bool vis[220][220];13 14 void getMat( )15 {16     for( int i = 0 ; i<n-1 ; i++ )17     {18         for( int j = i+1 ; j<n ; j++ )19         {20             if( node[i].x==node[j].x || node[i].y==node[j].y )21                 continue;22             int minX = min( node[i].x , node[j].x );23             int maxX = max( node[i].x , node[j].x );24             int minY = min( node[i].y , node[j].y );25             int maxY = max( node[i].y , node[j].y );26             if( vis[minX][minY] && vis[minX][maxY] && vis[maxX][minY] && vis[maxX][maxY] )27             {28                 mat[cnt].minX = minX , mat[cnt].minY = minY , mat[cnt].maxX = maxX , mat[cnt].maxY = maxY;29                 mat[cnt++].area = (maxX-minX) * (maxY-minY);30             }31         }32     }33 }34 35 int solve( int i , int j )36 {37     //i与j相同38     if( mat[i].minX==mat[j].minX && mat[i].maxX==mat[j].maxX && mat[i].minY==mat[j].minY && mat[i].maxY==mat[j].maxY )39         return -1;40     //i包含了J41     if( mat[i].minX<mat[j].minX && mat[i].maxX>mat[j].maxX && mat[i].minY<mat[j].minY && mat[i].maxY>mat[j].maxY )42         return mat[i].area;43     //j包含了i44     if( mat[i].minX>mat[j].minX && mat[i].maxX<mat[j].maxX && mat[i].minY>mat[j].minY && mat[i].maxY<mat[j].maxY )45         return mat[j].area;46     //重叠的情况 以i或j为参考都可以 固定一个47     if( (mat[i].minX>=mat[j].minX&&mat[i].minX<=mat[j].maxX) || (mat[i].maxX>=mat[j].minX&&mat[i].maxX<=mat[j].maxX) )48     {49         if( (mat[i].minY>=mat[j].minY&&mat[i].minY<=mat[j].maxY) || (mat[i].maxY>=mat[j].minY&&mat[i].maxY<=mat[j].maxY) )50         {51             return -1;52         }53     } 54     if( (mat[j].minX>=mat[i].minX&&mat[j].minX<=mat[i].maxX) || (mat[j].maxX>=mat[i].minX&&mat[j].maxX<=mat[i].maxX) )55     {56         if( (mat[j].minY>=mat[i].minY&&mat[j].minY<=mat[i].maxY) || (mat[j].maxY>=mat[i].minY&&mat[j].maxY<=mat[i].maxY) )57         {58             return -1;59         }60     }61     return mat[i].area + mat[j].area;62 }63 64 int main()65 {66     int ans;67     while( cin >> n && n )68     {69         memset( vis , false , sizeof(vis) );70         cnt = 0;71         for( int i = 0 ; i<n ; i++ )72         {73             cin >> node[i].x >> node[i].y;74             vis[ node[i].x ][ node[i].y ] = true;75         }76         getMat( );77         ans = -1;78         for( int i = 0 ; i<cnt-1 ; i++ )79         {80             for( int j = i+1 ; j<cnt ; j++ )81             {82                 ans = max( ans , solve(i,j) );83             }84         }85         if( ans==-1 )86             cout << "imp" << endl;87         else88             cout << ans << endl;89     }90     return 0;91 }
View Code

虽然写麻烦了=_=  但毕竟容易接受 就是判断出所有的不同情况来

 

懒得再开一篇了 将5131也放一起吧

它相比上题 难度差不多 但是容易写啊 没什么要注意的。。

 1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <map> 5 using namespace std; 6  7 int n; 8 const int size = 220; 9 map<string,int>mp;10 struct data11 {12     string name;13     int num;14 }node[size];15 16 bool cmp( const data p , const data q )17 {18     if( p.num == q.num )19     {20         return p.name < q.name;21     }22     return p.num > q.num;23 }24 25 void work( )26 {27     for( int i = 0 ; i<n ; i++ )28     {29         cout << node[i].name << " " << node[i].num << endl;30         mp[ node[i].name ] = i;31     }32 }33 34 int main()35 {36     cin.sync_with_stdio(false);37     int m , index , temp;38     char str[60];39     while( cin >> n && n )40     {41         mp.clear();42         for( int i = 0 ; i<n ; i++ )43         {44             cin >> node[i].name >> node[i].num;45         }46         sort( node , node+n , cmp );47         cin >> m;48         work( );49         while( m-- )50         {51             cin >> str;52             temp = mp[str];53             index = temp;54             while( index>=1 )55             {56                 if( node[index-1].num == node[index].num )57                 {58                     -- index;59                 }60                 else61                     break;62             }63             cout << index+1;64             index = max( 1 , temp-index+1 );65             if( index>1 )66                 cout << " " << index;67             cout << endl;68         }69     }70     return 0;71 }
View Code

 

hdu--5128--计算几何<算不上.暴力模拟> && hdu--5131--初级cmp