LETTers比赛第七场 Guess the Numbers
这是其它国家区预赛的题目,大家可以看出来区域现场赛最简单题的难度。
解题的思路很容易想到,四则运算处理可能比较麻烦~但是经过细心调试应该问题不大;还有就是排列的生成可以自己写,但是这里提倡用next_permutation()函数!还有一点是要注意结束的判断。
以下是参考解题程序:
View Code
1 #include<stdio.h> 2 #include<stack> 3 #include<algorithm> 4 #include<ctype.h> 5 #include<string.h> 6 using namespace std; 7 const int maxn=6; 8 int a[maxn]; 9 char s[1000]; 10 int n; 11 typedef struct 12 { 13 char name[5]; 14 int index; 15 }unkown; 16 unkown u[5]; 17 int solve() 18 { 19 int i; 20 sort(a,a+n); 21 int tot; 22 int len=strlen(s); 23 do 24 { 25 tot=0; 26 stack<char>op; 27 stack<int>value; 28 for(i=0;i<len;i++) 29 { 30 int yes=0; 31 char name[4]; 32 int tt=0; 33 while(isalpha(s[i])) 34 { 35 name[tt++]=s[i++]; 36 yes=1; 37 } 38 if(yes) 39 { 40 i--; 41 name[tt]=0; 42 int j; 43 for(j=0;j<tot;j++)if(strcmp(u[j].name,name)==0) 44 break; 45 if(j==tot){strcpy(u[tot].name,name);u[tot].index=tot;tot++;} 46 if(yes)value.push(a[u[j].index]); 47 } 48 else if(s[i]!=')')op.push(s[i]); 49 else 50 { 51 char s=op.top(); 52 op.pop(); 53 if(s=='*') 54 { 55 int t,r; 56 t=value.top(); 57 value.pop(); 58 r=value.top(); 59 value.pop(); 60 value.push(t*r); 61 } 62 else if(s=='+') 63 { 64 int t,r; 65 t=value.top(); 66 value.pop(); 67 r=value.top(); 68 value.pop(); 69 value.push(t+r); 70 } 71 else if(s=='-') 72 { 73 int t,r; 74 t=value.top(); 75 value.pop(); 76 r=value.top(); 77 value.pop(); 78 value.push(r-t); 79 } 80 op.pop(); 81 } 82 } 83 if(value.top()==a[n]) 84 { value.pop();return 1;} 85 value.pop(); 86 }while(next_permutation(a,a+n)); 87 return 0; 88 } 89 int main() 90 { 91 while(gets(s)!=NULL&&(strstr(s,"0 0")-s)!=0) 92 { 93 n=0; 94 int len=strlen(s); 95 int i; 96 sscanf(s,"%d",&n); 97 i=0; 98 while(isdigit(s[i])){i++;} 99 int j; 100 int tot=0; 101 for(j=i;j<len;j++) 102 { 103 int temp=0; 104 int yes=0; 105 while(isdigit(s[j])) 106 { 107 yes=1; 108 temp=temp*10+s[j]-'0'; 109 j++; 110 } 111 if(yes)a[tot++]=temp; 112 } 113 gets(s); 114 if(solve())printf("YES\n"); 115 else printf("NO\n"); 116 } 117 return 0; 118 }