识别密码锁中的正确密码10....0101
输入一段字符串,判断其中是否包含正确密码1(0)+101
要求:1、这里的(0)+表示可含有一个或者多个0,其中密码锁中的正确密码只需找出遍历的第一次密码,后面再出现的密码不作数,不可重复遍历
2、找到正确密码后要输出yes,空格,再对其找出的第一次正确密码需要用括号给标注出来,样例:
输入:1589210101743
输出:yes 15892(10101)743
3、输入的字符串含有非0非1外的字符,则直接输出:invalid
4、输入的字符均为0、1但是却不包含正确密码则输出:no
思路:采用函数调用和自动机状态图的思想解题。但找出正确密码部分的输出需要注意,因为要用括号找出正确密码,所以这个部分需要注意。可以采用定义两个全局变量,然后找出正确密码所在位置,把它存储在一个数组里面然后用括号括出来。
这里我的代码是通过根据第一遍正确密码恰好遍历结束的状态找出其下标位置,设置了一个n=3是为了从右括号找出的位置而往前找出左括号的位置,因为密码锁中的规定正确密码中的1的个数是固定,所以可以根据往前遍历的1的次数找出左括号的位置。
1 #include<stdio.h> 2 #define x0 0 3 #define x1 1 4 #define x2 2 5 #define x3 3 6 #define yes 4 7 #define yes1 5 8 #define invalid 6 9 #define no 7 10 int FA(int state,char input); 11 int main() 12 { 13 char a[1000]; 14 int state,i=0,j=0,n; 15 gets(a); 16 state=invalid; 17 while(a[i]!='\0') 18 { 19 state = FA(state,a[i]); 20 i++; 21 if(state==invalid) 22 break; 23 if(state==yes) 24 j=i-1; 25 } 26 n=3; 27 while(a[j-n]!='1') 28 { 29 n++; 30 } 31 i=0; 32 if (state==0 || state==1 || state==2 || state==3 || state==7) 33 printf("no\n"); 34 else if (state==6) 35 printf("invalid\n"); 36 else if (state==4 || state==5) 37 { 38 printf("yes "); 39 while(a[i]!='\0') 40 { 41 if(i==j-n) 42 printf("("); 43 printf("%c",a[i]); 44 if(i==j) 45 printf(")"); 46 i++; 47 } 48 printf("\n"); 49 } 50 return 0; 51 } 52 int FA(int state, char input) 53 { 54 switch(state) 55 { 56 case invalid: 57 if(input == '1') state=x0; 58 else if(input == '0') state=no; 59 else state=invalid; 60 break; 61 case x0: 62 if(input == '0') state=x1; 63 else if(input == '1') state=x0; 64 else state=invalid; 65 break; 66 case x1: 67 if(input == '1') state=x2; 68 else if(input == '0') state=x1; 69 else state=invalid; 70 break; 71 case x2: 72 if(input == '0') state=x3; 73 else if(input == '1') state=x0; 74 else state=invalid; 75 break; 76 case x3: 77 if(input == '1') state=yes; 78 else if(input == '0') state=x1; 79 else state=invalid; 80 break; 81 case yes: 82 if(input == '1'||input == '0') state=yes1; 83 else state=invalid; 84 break; 85 case yes1: 86 if(input == '1'||input == '0') state=yes1; 87 else state=invalid; 88 break; 89 case no: 90 if(input == '0') state=no; 91 else if(input == '1') state=x0; 92 else state=invalid; 93 break; 94 } 95 return state; 96 }