第一行输入一个整数
表示字符串及排列的长度。
第二行输入一个长度为
,仅由
和
构成的字符串
。
如果不存在满足条件的排列,直接输出
;否则,在一行上输出
个整数
表示你构造出的排列。
如果存在多个满足条件的排列,输出任意一个均可,系统将自动判定其正确性。请注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
3 001
3 1 2
对于这个样例,
由于
,排列的前一项元素无法构成一个排列;
由于
,排列的前两项元素无法构成一个排列;
由于
,排列的前三项元素构成一个排列;
同时,输出
、
等答案也都是合法的。
4 1110
-1
在此样例中,若存在合法排列,则前三位必须依次形成排列,但第四位又要求整体不形成排列,显然不可能,因此答案为。
#include <stdio.h>
#include <stdlib.h>
//让我判断是不是匹配还好说,让我构造??
//只能找规律,再想五分钟想不出来就老实看答案。
//好像找到规律了,遇到1则填对应的数字即可,遇到0则和下一个是1的位置交换数字即可,交换完之后就跳过下一个1的位置,不过这种只适合有解的情况啊。如果后面找不到有1的情况,则就当无解把
int main() {
int n;
scanf("%d",&n);
char *string=malloc(sizeof(char)*(n+1));
scanf("%s",string);
//去掉字符串的0位置,然后末尾的'\0'也不要了,这样结果才能一一对应
for(int i=n;i>0;i--)
{
string[i]=string[i-1];
}
int *result=malloc(sizeof(int)*(n+1));
for(int i=0;i<=n;i++) //初始结果数组为递增数组,但是后面元素下标为0的数字不用
{
result[i]=i;
}
//然后和字符串一一对应的了,找能交换的位置了
for (int i=1; i<=n; ) {
if(string[i]=='1') //遇到1则结果数组保持原样
{
i++;
}else if(string[i]=='0') //遇到0则找下一个为1的位置交换
{
int a=i;//记录当前位置
while(string[i]=='0') //跳过所有0的位置
{
i++;
if (i>n) { //如果找完后续所有位置都没有1的位置,则无解
printf("-1");
return 0;
}
}
//来到了string[i]=='1'的位置,和a的职位交换
int temp=result[a];
result[a]=result[i];
result[i]=temp; //交换
i++; //移动到下一个位置继续探索
}
}
//输出result数组的所有结果
for(int i=1; i<=n; i++)
{
printf("%d ",result[i]);
}
return 0;
}