Description
给出一个数字、加法、乘法和问号构成的表达式,要求把问号转化为数字、加法或乘法使得表达式合法
Input
第一行一整数TT表示用例组数,每组用例输入一个表达式
(|s|≤500,∑|s|≤105)(|s|≤500,∑|s|≤105)
Output
如果转化完所有问号后表达式可以合法则输出该表达式,否则输出IMPOSSIBLEIMPOSSIBLE
Sample Input
5
?????
0+0+0
?+*??
?0+?0
?0+0?
Sample Output
11111
0+0+0
IMPOSSIBLE
10+10
IMPOSSIBLE
Solution
只有当0?,+0?,∗0?0?,+0?,∗0?时需要把??变成运算符,否则都可以变成,转化完所有??后判断是否合法即可
Code
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 505
char s[maxn];
int T;
int Solve(char *s)
{
int flag=0,n=strlen(s);
for(int i=0;i<n;i++)
if(s[i]=='?')
{
if(i==0)s[i]='1';
else if(i==1)
{
if(s[0]=='0')s[i]='+';
else s[i]='1';
}
else
{
if(s[i-1]=='0'&&s[i-2]>='0'&&s[i-2]<='9'||s[i-1]!='0')s[i]='1';
else s[i]='+';
}
}
for(int i=0;i<n;i++)
{
if(s[i]=='+'||s[i]=='*')
{
if(i==0||i==n-1||s[i-1]=='+'||s[i-1]=='*')return 0;
}
else if(s[i]=='0')
{
if(i==0&&i<n-1&&s[i+1]>='0'&&s[i+1]<='9')return 0;
if(i&&(s[i-1]=='+'||s[i-1]=='*')&&s[i+1]>='0'&&s[i+1]<='9')return 0;
}
}
return 1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
if(Solve(s))printf("%s\n",s);
else printf("IMPOSSIBLE\n");
}
return 0;
}