| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这个 其实 ..K取值不到三位数 所以 完全可以从当前状态继续搜索如何从当前状态继续搜索呢
请看下面代码 第二次调用 就从原始状态开始就可以了
#pragma warning (disable :4996)
#include<stdio.h>
#include<algorithm>
using namespace std;
bool used[1026];
bool flag[1026];
int D[1026];
int data[1026];
int cnt,U;
void DFS(int k,int m)
{
if(k==m)
{
cnt++;
if(cnt<U)return;
for(int i=1;i<m;i++)
printf("%d ",data[i]);
printf("\n");
return ;
}
else
{
if(flag[k])
{
for(int i=1;i<m;i++)
{
if(cnt==U)return;
if(cnt<U&&!used[i])
{
used[i]=true;
data[k]=i;
DFS(k+1,m);
used[i]=false;
}
}
return;
}
flag[k]=true;
for(int i=D[k];i<m;i++)
{
if(cnt==U)return;
if(cnt<U&&!used[i])
{
used[i]=true;
data[k]=i;
DFS(k+1,m);
used[i]=false;
}
}
}
}
void DFS2(int k,int m)
{
if(k==m)
{
cnt++;
if(cnt<U)return;
for(int i=1;i<m;i++)
printf("%d ",data[i]);
printf("\n");
return ;
}
else
{
for(int i=1;i<m;i++)
{
if(cnt<U&&!used[i])
{
used[i]=true;
data[k]=i;
DFS(k+1,m);
used[i]=false;
}
}
}
}
int main ()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(used,false,sizeof(used));
memset(flag,false,sizeof(flag));
int N;
scanf("%d%d",&N,&U);
U;
cnt=-1;
for(int i=1;i<=N;i++) scanf("%d",D+i);
DFS(1,N+1);
while(cnt<U)
{
DFS2(1,N+1);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator