题意
给你一个字符串让你变成一个合法的字符串,如果无法变成合法的字符串就输出“IMPOSSIBLE”。
这种都是不合法的 +1+1, +1*+1, 01+001
思路
就是把+0?的这种变成+0+这种,其他的?全部都是1就好了,之后判断一下有没有前导0,或者有没有两个符号在一起(++,**)这种就好了
写模拟题还是有想清楚在写,想清楚了就好写了,要是想不清楚上去写,越写越乱反正。。。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
char ch[maxn];
int check()
{
int len = strlen(ch+1);
if(!isdigit(ch[1]) || !isdigit(ch[len])) return 0; // 对于+1+0和1+0+这种样例
for(int i = 1 ; i <= len ; i++)
{
if( !isdigit(ch[i]) && !isdigit(ch[i-1]) ) return 0; // 两个都是符号 ++ 这种
if(ch[i] == '0' && isdigit(ch[i+1])) //000001 这种前导0
{
int p = i;
while(ch[p] == '0') p -- ;
if(!isdigit(ch[p]) || p == -1) return 0;// 如果是 +00001这种是错的,或者 000001这种
}
}
return 1;
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
cin>>ch+1;
for(int i = 1 ; i <= strlen(ch+1) ; i++)
{
if(ch[i] == '0' && !isdigit(ch[i-1]) && ch[i+1] == '?') ch[i+1] = '+';
else if(ch[i] == '?') ch[i] = '1';
}
if(check()) cout<<ch+1<<endl;
else cout<<"IMPOSSIBLE"<<endl;
}
return 0;
}