TopCoder一简单题的解题过程

今天在Topcoder上做一道简单题,感觉这道题挺有意思的,就保存起来吧!

 

  
  
  
  
  1. Problem Statement   
  2.      A company is developing a 3-dimensional computer monitor. The monitor has a resolution of 1024 by 1024 by 1024 pixels. The monitor is a cube, with a grid of lasers on three sides of the cube, all of which share an edge (that is, no grid is on the face directly opposite another grid). As a result, one of these grids is in the XY-plane of the monitor, another is in the YZ-plane, and the third is in the XZ-plane. To "light up" a pixel, the laser on each grid which corresponds to the pixel's coordinate needs to be on, and the intersection of these three lasers is what creates the point of light.   
  3.  
  4. Create a class FullMonitor containing a method numLasers which takes as an argument a vector <string> pixels, representing the lit pixels, and returns the total number of lasers that must be activated. If the given vector <string> of pixels cannot be turned on without turning on other pixels (see example 4) then return -1.   
  5.  
  6. For example, if we wish to light the point (4,4,3), the XY-plane would have to light up the laser at (4,4), the YZ-plane would have to light up the laser at (4,3), and the XZ-plane would have to light up the laser at (4,3). In total, 3 lasers would have to be activated. If we were to then light the point (4,3,3), the following lasers would have to be activated: XY-plane (4,3), YZ-plane (3,3), XZ-plane (4,3). Since the XZ-plane's (4,3) laser is already activated, a total of 5 lasers would have to be activated.   
  7.  
  8. Each element of pixels is formatted as (quotes added for clarity) "X,Y,Z" where X, Y, and Z are the respective coordinates of the pixel. Each coordinate is an integer between 0 and 1023 inclusive (with no extra leading zeroes).   
  9.    
  10. Definition   
  11.      Class: FullMonitor   
  12. Method: numLasers   
  13. Parameters: vector <string>   
  14. Returns: int   
  15. Method signature: int numLasers(vector <string> pixels)   
  16. (be sure your method is public)   
  17.    
  18.        
  19.    
  20. Notes   
  21. - Each laser grid has 1024*1024=1048576 lasers, for a total of 3145728 possible activated lasers. However, this situation requires more lit pixels than can be represented using the input.   
  22. Constraints   
  23. - pixels will contain between 0 and 50 elements, inclusive.   
  24. - each element of pixels will be formatted as (quotes added for clarity) "X,Y,Z" where X, Y, and Z are integers between 0 and 1023, inclusive, with no extra leading zeroes   
  25. - each element of pixels will be unique.   
  26. Examples   
  27. 0)    
  28.      {"25,25,25"}  
  29.    
  30.    
  31. Returns: 3  
  32.    
  33. Only one pixel is lit, and it requires 3 lasers to be displayed.   
  34.    
  35.    
  36. 1)    
  37.      {"25,25,25","25,25,26"}  
  38.    
  39.    
  40. Returns: 5  
  41.    
  42. 2 pixels are lit, but share the same XY laser at point (25,25), so only 5 lasers are lit.   
  43.    
  44.    
  45. 2)    
  46.      {"25,25,25","25,25,26","25,26,26","25,26,25"}  
  47.    
  48.    
  49. Returns: 8  
  50.    
  51.    
  52.    
  53. 3)    
  54.      {"1000,1005,20","20,50,20","30,90,10","1005,30,90",  
  55.  "90,1000,1005","30,90,20","1000,90,10","40,90,10",  
  56.  "1000,1000,1000"}  
  57.    
  58.    
  59. Returns: -1  
  60.    
  61.    
  62.    
  63. 4)    
  64.      {"1,1,3","1,3,1","3,1,1"}  
  65.    
  66.    
  67. Returns: -1  
  68.    
  69. These three pixels cannot be lit without lighting the pixel (1,1,1), so return -1.    
  70.    
  71.    
  72. 5)    
  73.      {"1,1,3","1,3,1","3,1,1","1,1,1"}  
  74.    
  75.    
  76. Returns: 9  
  77.    
  78. The previous example, with (1,1,1) activated to make it possible.    
  79.    
  80.    
  81. 6)    
  82.      {"938,134,626","1015,310,957","427,741,13","388,513,56",  
  83. "914,169,526","716,540,478","796,461,500","506,886,866",  
  84. "44,185,744","474,104,631","557,402,744","992,132,804",  
  85. "440,499,122","895,845,612","711,576,984","281,846,475",  
  86. "781,620,301","305,632,954","874,659,36","17,978,393",  
  87. "765,481,372","612,316,8","902,281,515","272,125,1012",  
  88. "413,513,987","595,940,1014","858,1019,100","899,554,613",  
  89. "226,995,592","793,939,286","386,41,212","111,899,737",  
  90. "339,199,117","1014,710,638","413,187,56","301,691,368",  
  91. "387,285,286","546,356,739","366,356,660","877,461,737",  
  92. "538,301,629","707,116,7","701,730,70"}  
  93.    
  94.    
  95. Returns: -1  
  96.    
  97.    
  98.    
  99. 7)    
  100.      {"286,596,559","502,325,84","303,56,960","28,678,821",  
  101. "542,57,303","233,418,91","13,520,124","645,129,889",  
  102. "438,433,951","835,953,56","921,531,943","416,159,446",  
  103. "513,426,1018","778,486,254","132,380,822","828,351,787",  
  104. "659,531,866","893,140,419","603,721,110","888,144,689",  
  105. "861,869,515","632,912,973","435,828,676","526,365,850",  
  106. "162,860,173","637,910,701","169,21,311","431,722,798",  
  107. "674,663,1012","451,343,584","132,380,1000","184,720,1011"}  
  108.    
  109.    
  110. Returns: 95  
  111.    
  112.    
  113.    
  114. 8)    
  115.      {"1,0,0","4,1,2","0,2,0","0,0,0","4,4,3","2,3,2","0,4,3",  
  116. "4,2,3","4,4,1","2,2,0","4,1,1","4,0,1","1,0,2","1,3,2",  
  117. "0,2,3","4,0,2","2,2,3"}  
  118.    
  119.    
  120. Returns: 31  
  121.    
  122.    
  123.    
  124.  
  125. This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.   

 

FullMonitor解题报告
今天做topCoder上面的一道300分的题目,感觉不难,但还是让我花费了近两个小时。中间还错了一次。如果是的比赛场上,肯定就纠结了。
这道题是空间几何的,考人的空间思维能力。题目的大意是这样的,三维的空间里有三块板,xy,xz,yz;这三块板的像素是1024px.每块板的每个像素点都能发出射线。如果三块板的三条射线相交,则交点被点亮。
现在呢,已知有n个点被点亮,问你:一共需要多少个像素点发光。如果板上发光像素点所点亮的空间点有不在输入的点集中,则输出-1。
我开始想到的是把输入集合中所有点的x,y,z集合去重,然后组合,如果组合所得的值大于点集,则返回-1.否则,把点按坐标组合,输出组合值。
原代码如下:
///*
// * CRPFCharityChallengeFinal.cpp
// *
// * Created on: 2012-6-17
// *       Author: Administrator
// */
//#include<vector>
//#include<string>
//#include<cstdio>
//#include<cstring>
//#include<set>
//#include<stdio.h>
//using namespace std;
//void print(vector<int> sou){
// printf("\n");
// for(int i=0;i<sou.size();i++){
//          printf("%d\t",sou.at(i));
// }
// printf("\n");
//}
//void print(set<int> s){
// set<int>::iterator it;
// printf("\n");
// for(it=s.begin();it!=s.end();++it){
//      printf("%d\t",*it);
// }
// printf("\n");
//}
//struct pares{
// int x;
// int y;
//};
//bool operator<(const pares &t1,const pares &t2)
//{
//      if(t1.x!=t2.x)
//          return t1.x>t2.x;
//      else
//          return t1.y>t2.y;
//}
//class FullMonitor{
//public :
// int numLasers(vector <string> pixels);
//private:
// vector<int> parse(string str);
//};
//vector<int> FullMonitor::parse(string str){
// char s[100];
// strcpy(s,str.c_str());
// const char *d=",";
// const char *p;
// p=strtok(s,d);
// vector<int> res;
// while(p){
//      res.push_back(atoi(p));
//      p=strtok(NULL,d);
// }
// return res;
//}
//int FullMonitor::numLasers(vector<string> pixels){
// set<int> x,y,z;
// set<int>::iterator ix,iy,iz;
// set<pares> xy,xz,yz;
// set<pares>::iterator ixy,ixz,iyz;
// vector<int> temp;
// for(int i=0;i<pixels.size();++i){
//      temp=parse(pixels.at(i));
////        print(temp);
//      x.insert(temp[0]);
//      y.insert(temp[1]);
//      z.insert(temp[2]);
// }
////    print(x);
////    print(y);
////    print(z);
// int total=x.size()*y.size()*z.size();
// if(total>pixels.size())
//      return -1;
//
// for(ix=x.begin();ix!=x.end();++ix){
//          for(iy=y.begin();iy!=y.end();++iy){
//             pares p;
//             p.x=(*ix);
//             p.y=(*iy);
//             xy.insert(p);
//         }
//      }
// for(ix=x.begin();ix!=x.end();++ix){
//          for(iz=z.begin();iz!=z.end();++iz){
//             pares p;
//             p.x=(*ix);
//             p.y=(*iz);
//             xz.insert(p);
//          }
//      }
//
// for(iy=y.begin();iy!=y.end();++iy){
//      for(iz=z.begin();iz!=z.end();++iz){
//             pares p;
//             p.x=(*iy);
//             p.y=(*iz);
//             yz.insert(p);
//          }
//      }
// return xy.size()+xz.size()+yz.size();
//}
//
//int main(){
// FullMonitor fm;
// string str[4]={"1,1,3","1,3,1","3,1,1","1,1,1"};
// vector<string> vs;
// vs.insert(vs.begin(),str,str+4);
// printf("%d\n",fm.numLasers(vs));
//
// return 0;
//}
 
结果test到第5组数据时就报错了,我想了好久,都没想通。后来,这样想:每个点都可以拆分成三块板上所对应的坐标。<x,y> <y,z> <x,z>。 这样的话,就能很快求出三块板上对应的点集。然后对三块板的点集进行组合,如果有新的组合出现,则返回-1,否则,返回三块板点集的和。
       新代码如下:
/*
 * CRPFCharityChallengeFinal.cpp
 *
 * Created on: 2012-6-17
 *       Author: Administrator
 */
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<set>
#include<stdio.h>
using namespace std;
void print(vector< int> sou){
    printf("\n");
    for ( int i=0;i<sou.size();i++){
           printf("%d\t",sou.at(i));
    }
    printf("\n");
}
void print(set< int> s){
    set< int>::iterator it;
    printf("\n");
    for(it=s.begin();it!=s.end();++it){
       printf("%d\t",*it);
    }
    printf("\n");
}
struct pares{
    int x,y;
};
bool operator<( const pares &t1, const pares &t2)
{
       if(t1.x!=t2.x)
           return t1.x>t2.x;
       else
           return t1.y>t2.y;
}
struct three{
    int x,y,z;
};
bool operator<( const three &t1, const three &t2){
    if(t1.x!=t2.x)
           return t1.x>t2.x;
       else if(t1.y!=t2.y)
           return t1.y>t2.y;
       else
           return t1.z>t2.z;
}
class FullMonitor{
public :
    int numLasers(vector <string> pixels);
private:
    vector< int> parse(string str);
};
vector< int> FullMonitor::parse(string str){
    char s[100];
    strcpy(s,str.c_str());
    const char *d=",";
    const char *p;
    p= strtok(s,d);
    vector< int> res;
    while(p){
       res.push_back( atoi(p));
       p= strtok(NULL,d);
    }
    return res;
}
int FullMonitor::numLasers(vector<string> pixels){
    set<pares> xy,xz,yz;
    set<pares>::iterator ixy,ixz,iyz;
    set<three> xyz;
    vector< int> temp;
    for ( int i=0;i<pixels.size();++i){
       temp=parse(pixels.at(i));
       three th;
       th.x=temp[0];
       th.y=temp[1];
       th.z=temp[2];
       xyz.insert(th);
 
       pares pa,pb,pc;
       pa.x=temp[0];pa.y=temp[1];
       xy.insert(pa);
 
       pb.x=temp[1];pb.y=temp[2];
       yz.insert(pb);
 
       pc.x=temp[0];pc.y=temp[2];
       xz.insert(pc);
    }
    unsigned int old=xyz.size();
    for(ixy=xy.begin();ixy!=xy.end();++ixy){
       for(iyz=yz.begin();iyz!=yz.end();++iyz){
           for(ixz=xz.begin();ixz!=xz.end();++ixz){
              if((*ixy).x==(*ixz).x&&//<x,y> <x,z>
                 (*ixy).y==(*iyz).x&&//<x,y> <y,z>
                 (*iyz).y==(*ixz).y){//<y,z> <x,z>
                     three th;
                     th.x=(*ixy).x;
                     th.y=(*ixy).y;
                     th.z=(*iyz).y;
                     xyz.insert(th);
                     if(xyz.size()!=old)
                         return -1;
                  }
           }
       }
    }
 
       return xy.size()+xz.size()+yz.size();
 
}
 
int main(){
    FullMonitor fm;
    string str[4]={"1,1,3","1,3,1","3,1,1","1,1,1"};
    vector<string> vs;
    vs.insert(vs.begin(),str,str+4);
    printf("%d\n",fm.numLasers(vs));
 
    return 0;
}
Test全部通过。

你可能感兴趣的:(topcoder,FullMonitor解题报告)