本题难点可能在于如何判断两点连接是否经过其他的点

1、我是利用的一个cFlag数组做标记,让需要经过其他点的两点数值相同如1、9连接需要经过其他的点,则cFlag[1] = cFlag[9];1、5连接不需要经过其他的点,则cFlag[1] != cFlag[5]
2、利用num数组来标记此点是否被占用,如:1被占用,则num[1] = 1;9没被占用,则num[9] = 0

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>

int num[15]; //记录数字是否出现过
char str[35]; //记录输入的字符串

void isLegal(char* str, int nLen)
{
    if(nLen > 9)
    {
        printf("NO\n");
        return;
    }

    int i;
    int temp1; //用来存放str[i-1]存放的数字
    int temp2; //用来存放str[i]存放的数字
    char cFlag[10] = {5, 1, 3, 1, 2, 0, 2, 1, 3, 1}; //标记,如1、9连接需要经过其他的点,则cFlag[1] = cFlag[9];1、5连接不需要经过其他的点,则cFlag[1] != cFlag[5]
    for(i = 0; i < nLen; i++)
    {
        temp2 = str[i] - '0';
        if(0 == i)
        {
            num[temp2] = 1;
            continue;
        }

        //判断该点是否已经被占用,如果被占用直接退出
        if(1 == num[temp2])
        {
            printf("NO\n");
            return;
        }

        temp1 = str[i-1] - '0';

        //判断两点的连线是否经过其他点
        if(cFlag[temp1] == cFlag[temp2])//经过其他点 情况:一个数字在123,一个数字在789;两个数字在同一行且差为2
        {
            //判断经过的点是否已经被占用,即num[(temp1+temp2)/2]是否为1
            if(0 == num[(temp1+temp2)/2]) //经过的点没有被占用
            {
                printf("NO\n");
                return;
            }
            else
                num[temp2] = 1;
        }
        else //没有经过其他点
            num[temp2] = 1;
    }

    printf("YES\n");
}

int main(void)
{
    int nLen;
    while(~scanf("%s", str))
    {
       nLen = strlen(str);
        isLegal(str, nLen);
        memset(str, 0, sizeof(str));
        memset(num, 0, sizeof(num));
    }

}