Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这个 其实 ..K取值不到三位数 所以 完全可以从当前状态继续搜索

Posted by 1178450780 at 2016-11-14 23:11:05 on Problem 1833
如何从当前状态继续搜索呢
请看下面代码  第二次调用  就从原始状态开始就可以了
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator