J - Jokewithpermutation ( DFS )
题意:右边有n个数,从1到n, 现在把他们之间的空格去掉得到左边的字符串, 现在给出左边的字符串,求右边分隔开的数列。
思路: DFS, 见代码
代码:
#include <bits/stdc++.h>
using namespace std;
int via[160];
char a[155];
int ans[155],cnt,isp,len,n;
int limit[160];
void bfs( int i )
{
if (isp==1) return ;
if ( i>=len ) {
isp = 1;
for ( int i=0; i<cnt-1; i++ ) {
cout << ans[i] << " ";
}
cout << ans[cnt-1] << endl;
return ;
}
if ( i==len-1 ) {
int x = a[i]-'0';
if ( via[x]==0 && x<=n ) {
via[x] = 1;
ans[cnt++] = x;
bfs(i+1);
via[x] = 0;
cnt --;
}
}
else {
int x = a[i]-'0';
if ( via[x]==0 && x<=n ) {
via[x] = 1;
ans[cnt++] = x;
bfs(i+1);
via[x] = 0;
cnt --;
}
x = (a[i]-'0')*10 + a[i+1]-'0';
if ( via[x]==0 && x<=n ) {
via[x] = 1;
ans[cnt++] = x;
bfs(i+2);
via[x] = 0;
cnt --;
}
}
}
int main()
{
freopen("joke.in","r",stdin);
freopen("joke.out","w",stdout);
limit[0]=0;limit[1]=1;limit[2]=2;
for ( int i=0; i<=9; i++ ) {
limit[i] = i;
}
cnt = 10;
for ( int i=11; cnt<=50; i+=2 ) {
limit[i] = cnt++;
}
memset(via,0,sizeof(via));
cin >> a;
len = strlen(a);
n = limit[len];
isp = 0;
cnt = 0;
bfs(0);
return 0;
}