首页 > 代码库 > C++ P1318 Jam的计数法(NOIP2006普及组复赛第3题)

C++ P1318 Jam的计数法(NOIP2006普及组复赛第3题)

#include<iostream>
#include<cstdio>
using namespace std;

int s,t,w,a[30],time=5;
char c[30];
bool ok;//ok表示是否找到规定集合;

void data_in()//使用位向量法;
{
  scanf("%d%d%d",&s,&t,&w);
  scanf("%s",c);
  for(int i=0;i<w;i++)
  a[c[i]-96]=1;
}

void DFS(int x,int len)
{
  if(x>t)
  {
    if(len==w)
    {
      if(!ok){ok=1;return;}
      if(time>0)
        {
          time--;
          for(int i=s;i<=t;i++) if(a[i]) printf("%c",i+96);
          printf("\n");
        }
      }
    return;
  }
  for(int i=1;i>=0;i--)if(len<=w)
  {
    if(ok)
    {
      a[x]=i;
      DFS(x+1,len+i);
    }
    if(!ok) if(a[x]==i)DFS(x+1,len+i);
    if(time==0) return;
  }
}

int main()
{
  // freopen("test.in","r",stdin);
  // freopen("test.out","w",stdout);
  data_in();
  DFS(s,0);
  return 0;
}

C++ P1318 Jam的计数法(NOIP2006普及组复赛第3题)