本题难点可能在于如何判断两点连接是否经过其他的点
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));
}
}
京公网安备 11010502036488号