HDU 6342 Expression in Memories(模拟)多校题解

题意:给你一个规则,问你写的对不对。

思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字。我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想。

下面的讲解问号只改为+或1...

对于(null)0?,+0?,*0?一律只能改为+,否则必是前导零,其他情况问号改为1,判断情况的时候注意一下i的范围,比如i==0时,s[i - 1]越界。

判断对错时对++,(null)+,+(null)符号两边没数字的判错,如果01前是null或者+*判错。

给几个样例:

0??0       0?0?0      01?+0      0?*0

代码:

#include<cstdio>
#include<set>
#include<stack>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 560+5;
const int INF = 0x3f3f3f3f;
char s[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int flag = 0;
scanf("%s",s);
int len = strlen(s);
for(int i = 0;i < len;i++){
if(s[i] == '?'){
if(i == 1 && s[i - 1] == '0') //(null)0?
s[i] = '+';
else if(i >= 2 && s[i - 1] == '0' && (s[i - 2] == '+' || s[i - 2] == '*')) //+0?,*0?
s[i] = '+';
else
s[i] = '1';
}
}
for(int i = 0;i < len;i++){
if(s[i] == '0' && (s[i + 1] >= '0' && s[i + 1] <= '9' && i < len - 1) && (i == 0 || (s[i - 1] < '0' || s[i - 1] > '9'))){
//01前是null或者+*
flag = 1;
break;
}
if((s[i] == '*' || s[i] == '+') && (s[i + 1] == '*' || s[i + 1] == '+') && i < len - 1){
//++
flag = 1;
break;
}
if(s[i] == '+' || s[i] == '*'){
if(i == 0 || i == len - 1){ //(null)+,+(null)
flag = 1;
break;
}
if(s[i - 1] < '0' || s[i - 1] > '9'){ //++
flag = 1;
break;
}
if(s[i + 1] < '0' || s[i + 1] > '9'){ //++
flag = 1;
break;
}
}
}
if(flag) printf("IMPOSSIBLE\n");
else printf("%s\n",s);
}
return 0;
}
上一篇:Android Stutio中使用java8的Lambda表达式


下一篇:算法与数据结构(十七) 基数排序(Swift 3.0版)