fork download
  1. #pragma warning(disable: 4996)
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <set>
  5. using namespace std;
  6.  
  7. struct TPoint{
  8. struct _Compair_Less{
  9. bool operator () (const TPoint* l, const TPoint* r) const
  10. {
  11. if(l->y < r->y)
  12. return true;
  13. else if(l->y == r->y && l->x < r->x)
  14. return true;
  15. return false;
  16. }
  17. };
  18.  
  19. TPoint(): Link(0) {}
  20.  
  21. int y, x;
  22. unsigned char Link;
  23.  
  24. bool GetNextPoint(char rotate, TPoint& _result){
  25. switch(rotate)
  26. {
  27. case 0: _result.y--; return 0 != (Link & 0x01);
  28. case 1: _result.y--; _result.x++; return 0 != (Link & 0x02);
  29. case 2: _result.x++; return 0 != (Link & 0x04);
  30. case 3: _result.y++; _result.x++; return 0 != (Link & 0x08);
  31. case 4: _result.y++; return 0 != (Link & 0x10);
  32. case 5: _result.y++; _result.x--; return 0 != (Link & 0x20);
  33. case 6: _result.x--; return 0 != (Link & 0x40);
  34. case 7: _result.y--; _result.x--; return 0 != (Link & 0x80);
  35. }
  36. return false;
  37. }
  38. };
  39.  
  40. void LinkShape(TPoint* pThis, TPoint* pNext, int Rotate)
  41. {
  42. pThis->Link |= (0x01 << Rotate);
  43. Rotate += 4;
  44. if(8 <= Rotate)
  45. Rotate -= 8;
  46. //Rotate &= 7;
  47. pNext->Link |= (0x01 << Rotate);
  48. }
  49. typedef set<TPoint*, TPoint::_Compair_Less> SET_PSHAPE;
  50. int main()
  51. {
  52. vector<TPoint> vData;
  53. vData.resize(100000);
  54. int cntData = 1;
  55. vData[0].y = vData[0].x = 0;
  56. vData[0].Link = 0;
  57. SET_PSHAPE set_pData;
  58. set_pData.insert(&vData[0]);
  59. TPoint* pThis = &vData[0];
  60.  
  61. int cntShape = 0;
  62.  
  63. int N;
  64. scanf("%d", &N);
  65. while(0<N)
  66. {
  67. char R;
  68. scanf("%c", &R);
  69. if(R < '0' || '7' < R)
  70. continue;
  71. N--;
  72. R -= '0';
  73.  
  74. TPoint tempPoint = *pThis;
  75. TPoint* pNext;
  76. bool isLinked = pThis->GetNextPoint(R, tempPoint);
  77. SET_PSHAPE::iterator iter = set_pData.find(&tempPoint);
  78. if(iter == set_pData.end()) {
  79. pNext = &vData[cntData++];
  80. pNext->y = tempPoint.y, pNext->x = tempPoint.x;
  81. set_pData.insert(pNext);
  82. }
  83. else {
  84. pNext = *iter;
  85. if(!isLinked)
  86. cntShape++;
  87. }
  88.  
  89. if(!isLinked)
  90. {
  91. LinkShape(pThis, pNext, R);
  92. }
  93.  
  94. pThis = pNext;
  95. }
  96. printf("%d\n", cntShape);
  97. return 0;
  98. }
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
0