#include <iostream>
using namespace std;
// valid transition from x to n[x-'1'][0 or 1]
int n[9][2] =
{
{'6','8'},{'7','9'},{'4','8'},
{'3','9'},{ 0 , 0 },{'1','7'},
{'2','6'},{'1','3'},{'2','4'}
};
// i is a pointer to where to start on a string
bool L(char * i)
{
char c = 0;
// move if not \0 and (not-first-char or is a valid move)
while(*i && (!c || *i==n[c-'1'][0] || *i==n[c-'1'][1]))
{
c=*i++;
}
return !*i; // success if it's \0
}
int main()
{
char *falsy = "183492760";
printf("%s ~ %s \n", falsy, L(falsy)?"true":"false");
char *truthy = "618349276";
printf("%s ~ %s \n", truthy, L(truthy)?"true":"false");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIC8vIHZhbGlkIHRyYW5zaXRpb24gZnJvbSB4IHRvIG5beC0nMSddWzAgb3IgMV0KCiAgICBpbnQgbls5XVsyXSA9CiAgICB7CiAgICAgICAgeyc2JywnOCd9LHsnNycsJzknfSx7JzQnLCc4J30sCiAgICAgICAgeyczJywnOSd9LHsgMCAsIDAgfSx7JzEnLCc3J30sCiAgICAgICAgeycyJywnNid9LHsnMScsJzMnfSx7JzInLCc0J30KICAgIH07CgogICAgLy8gaSBpcyBhIHBvaW50ZXIgdG8gd2hlcmUgdG8gc3RhcnQgb24gYSBzdHJpbmcKCiAgICBib29sIEwoY2hhciAqIGkpCiAgICB7CiAgICAgICAgY2hhciBjID0gMDsKICAgICAgICAKICAgICAgICAvLyBtb3ZlIGlmIG5vdCBcMCBhbmQgKG5vdC1maXJzdC1jaGFyIG9yIGlzIGEgdmFsaWQgbW92ZSkKCiAgICAgICAgd2hpbGUoKmkgJiYgKCFjIHx8ICppPT1uW2MtJzEnXVswXSB8fCAqaT09bltjLScxJ11bMV0pKQogICAgICAgIHsKICAgICAgICAgICAgYz0qaSsrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gISppOyAvLyBzdWNjZXNzIGlmIGl0J3MgXDAKICAgIH0KCmludCBtYWluKCkKewoJY2hhciAqZmFsc3kgPSAiMTgzNDkyNzYwIjsKCXByaW50ZigiJXMgfiAlcyBcbiIsIGZhbHN5LCBMKGZhbHN5KT8idHJ1ZSI6ImZhbHNlIik7CgkKCWNoYXIgKnRydXRoeSA9ICI2MTgzNDkyNzYiOwoJcHJpbnRmKCIlcyB+ICVzIFxuIiwgdHJ1dGh5LCBMKHRydXRoeSk/InRydWUiOiJmYWxzZSIpOwoJCglyZXR1cm4gMDsKfQoK