#pragma warning(disable: 4996)
#include <stdio.h>
#include <vector>
#include <set>
using namespace std;
struct TPoint{
struct _Compair_Less{
bool operator () (const TPoint* l, const TPoint* r) const
{
if(l->y < r->y)
return true;
else if(l->y == r->y && l->x < r->x)
return true;
return false;
}
};
TPoint(): Link(0) {}
int y, x;
unsigned char Link;
bool GetNextPoint(char rotate, TPoint& _result){
switch(rotate)
{
case 0: _result.y--; return 0 != (Link & 0x01);
case 1: _result.y--; _result.x++; return 0 != (Link & 0x02);
case 2: _result.x++; return 0 != (Link & 0x04);
case 3: _result.y++; _result.x++; return 0 != (Link & 0x08);
case 4: _result.y++; return 0 != (Link & 0x10);
case 5: _result.y++; _result.x--; return 0 != (Link & 0x20);
case 6: _result.x--; return 0 != (Link & 0x40);
case 7: _result.y--; _result.x--; return 0 != (Link & 0x80);
}
return false;
}
};
void LinkShape(TPoint* pThis, TPoint* pNext, int Rotate)
{
pThis->Link |= (0x01 << Rotate);
Rotate += 4;
if(8 <= Rotate)
Rotate -= 8;
//Rotate &= 7;
pNext->Link |= (0x01 << Rotate);
}
typedef set<TPoint*, TPoint::_Compair_Less> SET_PSHAPE;
int main()
{
vector<TPoint> vData;
vData.resize(100000);
int cntData = 1;
vData[0].y = vData[0].x = 0;
vData[0].Link = 0;
SET_PSHAPE set_pData;
set_pData.insert(&vData[0]);
TPoint* pThis = &vData[0];
int cntShape = 0;
int N;
scanf("%d", &N);
while(0<N)
{
char R;
scanf("%c", &R);
if(R < '0' || '7' < R)
continue;
N--;
R -= '0';
TPoint tempPoint = *pThis;
TPoint* pNext;
bool isLinked = pThis->GetNextPoint(R, tempPoint);
SET_PSHAPE::iterator iter = set_pData.find(&tempPoint);
if(iter == set_pData.end()) {
pNext = &vData[cntData++];
pNext->y = tempPoint.y, pNext->x = tempPoint.x;
set_pData.insert(pNext);
}
else {
pNext = *iter;
if(!isLinked)
cntShape++;
}
if(!isLinked)
{
LinkShape(pThis, pNext, R);
}
pThis = pNext;
}
printf("%d\n", cntShape);
return 0;
}
I3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ5OTYpCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFRQb2ludHsKICAgIHN0cnVjdCBfQ29tcGFpcl9MZXNzewogICAgICAgIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IFRQb2ludCogbCwgY29uc3QgVFBvaW50KiByKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgaWYobC0+eSA8IHItPnkpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZihsLT55ID09IHItPnkgJiYgbC0+eCA8IHItPngpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH07CgogICAgVFBvaW50KCk6IExpbmsoMCkge30KCiAgICBpbnQgeSwgeDsKICAgIHVuc2lnbmVkIGNoYXIgTGluazsKCiAgICBib29sIEdldE5leHRQb2ludChjaGFyIHJvdGF0ZSwgVFBvaW50JiBfcmVzdWx0KXsKICAgICAgICBzd2l0Y2gocm90YXRlKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6IF9yZXN1bHQueS0tOyByZXR1cm4gMCAhPSAoTGluayAmIDB4MDEpOwogICAgICAgIGNhc2UgMTogX3Jlc3VsdC55LS07IF9yZXN1bHQueCsrOyByZXR1cm4gMCAhPSAoTGluayAmIDB4MDIpOwogICAgICAgIGNhc2UgMjogX3Jlc3VsdC54Kys7IHJldHVybiAwICE9IChMaW5rICYgMHgwNCk7CiAgICAgICAgY2FzZSAzOiBfcmVzdWx0LnkrKzsgX3Jlc3VsdC54Kys7IHJldHVybiAwICE9IChMaW5rICYgMHgwOCk7CiAgICAgICAgY2FzZSA0OiBfcmVzdWx0LnkrKzsgcmV0dXJuIDAgIT0gKExpbmsgJiAweDEwKTsKICAgICAgICBjYXNlIDU6IF9yZXN1bHQueSsrOyBfcmVzdWx0LngtLTsgcmV0dXJuIDAgIT0gKExpbmsgJiAweDIwKTsKICAgICAgICBjYXNlIDY6IF9yZXN1bHQueC0tOyByZXR1cm4gMCAhPSAoTGluayAmIDB4NDApOwogICAgICAgIGNhc2UgNzogX3Jlc3VsdC55LS07IF9yZXN1bHQueC0tOyByZXR1cm4gMCAhPSAoTGluayAmIDB4ODApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07Cgp2b2lkIExpbmtTaGFwZShUUG9pbnQqIHBUaGlzLCBUUG9pbnQqIHBOZXh0LCBpbnQgUm90YXRlKQp7CiAgICBwVGhpcy0+TGluayB8PSAoMHgwMSA8PCBSb3RhdGUpOwogICAgUm90YXRlICs9IDQ7CiAgICBpZig4IDw9IFJvdGF0ZSkKICAgICAgICBSb3RhdGUgLT0gODsKICAgIC8vUm90YXRlICY9IDc7CiAgICBwTmV4dC0+TGluayB8PSAoMHgwMSA8PCBSb3RhdGUpOwp9CnR5cGVkZWYgc2V0PFRQb2ludCosIFRQb2ludDo6X0NvbXBhaXJfTGVzcz4gU0VUX1BTSEFQRTsKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8VFBvaW50PiB2RGF0YTsKICAgIHZEYXRhLnJlc2l6ZSgxMDAwMDApOwogICAgaW50IGNudERhdGEgPSAxOwogICAgdkRhdGFbMF0ueSA9IHZEYXRhWzBdLnggPSAwOwogICAgdkRhdGFbMF0uTGluayA9IDA7CiAgICBTRVRfUFNIQVBFIHNldF9wRGF0YTsKICAgIHNldF9wRGF0YS5pbnNlcnQoJnZEYXRhWzBdKTsKICAgIFRQb2ludCogcFRoaXMgPSAmdkRhdGFbMF07CgogICAgaW50IGNudFNoYXBlID0gMDsKCiAgICBpbnQgTjsKICAgIHNjYW5mKCIlZCIsICZOKTsKICAgIHdoaWxlKDA8TikKICAgIHsKICAgICAgICBjaGFyIFI7CiAgICAgICAgc2NhbmYoIiVjIiwgJlIpOwogICAgICAgIGlmKFIgPCAnMCcgfHwgJzcnIDwgUikKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgTi0tOwogICAgICAgIFIgLT0gJzAnOwoKICAgICAgICBUUG9pbnQgdGVtcFBvaW50ID0gKnBUaGlzOwogICAgICAgIFRQb2ludCogcE5leHQ7CiAgICAgICAgYm9vbCBpc0xpbmtlZCA9IHBUaGlzLT5HZXROZXh0UG9pbnQoUiwgdGVtcFBvaW50KTsKICAgICAgICBTRVRfUFNIQVBFOjppdGVyYXRvciBpdGVyID0gc2V0X3BEYXRhLmZpbmQoJnRlbXBQb2ludCk7CiAgICAgICAgaWYoaXRlciA9PSBzZXRfcERhdGEuZW5kKCkpIHsKICAgICAgICAgICAgcE5leHQgPSAmdkRhdGFbY250RGF0YSsrXTsKICAgICAgICAgICAgcE5leHQtPnkgPSB0ZW1wUG9pbnQueSwgcE5leHQtPnggPSB0ZW1wUG9pbnQueDsKICAgICAgICAgICAgc2V0X3BEYXRhLmluc2VydChwTmV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwTmV4dCA9ICppdGVyOwogICAgICAgICAgICBpZighaXNMaW5rZWQpCiAgICAgICAgICAgICAgICBjbnRTaGFwZSsrOwogICAgICAgIH0KCiAgICAgICAgaWYoIWlzTGlua2VkKQogICAgICAgIHsKICAgICAgICAgICAgTGlua1NoYXBlKHBUaGlzLCBwTmV4dCwgUik7CiAgICAgICAgfQoKICAgICAgICBwVGhpcyA9IHBOZXh0OwogICAgfQogICAgcHJpbnRmKCIlZFxuIiwgY250U2hhcGUpOwogICAgcmV0dXJuIDA7Cn0=