hdu 4474 数位搜索bfs

点击打开链接

题意:0-9这十个数字里面的若干个数字组合出一个数,使这个数是N的倍数,求最小的这个这样的数,不存在的话输出-1。

如果枚举n的倍数 但是不确定到哪里为止输出-1。

对于 a,b同余n &&b>a 保留a即可 
因为a*10+k,b*10+k同余n,a,b同解

所以队列结点保存余数&&由上得:不保存相同余数,BFS时在末尾添加数字生成新的余数,直到余数为0即可


 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int N=1e5+20;
//对于 a,b同余n &&b>a 保留a即可 
//因为a*10+k,b*10+k同余n,a b同解  
int n,m;
int vis[N];
int num[N],pre[N];
queue q;//队列存x%n的余数 

void Print(int u)//递归打印 
{ 
	if(pre[u]!=-1)
	Print(pre[u]);
	
	printf("%d",num[u]); 
	
}
void bfs()
{
	memset(pre,-1,sizeof(pre));
	memset(num,-1,sizeof(num));
	for(int i=1;i<=9;i++)
	{
		if(!vis[i])
		{	
			int t=i%n;
			if(t==0)
			{
				cout<>n>>m)
	{
		memset(vis,0,sizeof(vis));
		while(!q.empty())
		{
			q.pop();
		}
		for(int i=1;i<=m;i++)
		{
			int x;
			cin>>x;
			vis[x]=1;	
		}
		printf("Case %d: ",++cas);
		bfs();
			
		printf("\n");
	}
	
    return 0;
}




你可能感兴趣的:(搜索,Math,紫书第10章Math专题)