題意:給你一個規則,問你寫的對不對。
思路:規則大概概括爲:不能出現前導零,符號兩邊必須是合法數字。我們先把所有問號改好,再去判斷現在是否合法,否則問題會變得很比不分開判斷複雜。比如0?0判斷到第2個0時你還要去看前一個?是什麼。
下面的講解問號只改爲+或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;
}