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