您的位置:首页 > 其它

hdu 4474 数位搜索bfs

2016-11-03 22:42 330 查看
点击打开链接

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

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

对于 a,b同余n &&b>a 保留a即可 

因为a*10+k,b*10+k同余n,a,b同解

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

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
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
;
int num
,pre
;
queue<int> 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<<i;
return;
}
q.push(t);
num[t]=i;
}
}
while(!q.empty())
{
//cout<<x<<endl;
int x=q.front();
q.pop();
for(int i=0;i<10;i++)
{
if(!vis[i])
{
int r=(x*10+i)%n;
if(num[r]==-1)
{
pre[r]=x;//前一个结点
num[r]=i;//当前结点最后一位数
q.push(r);
}
if(r==0)
{
Print(r);
return;
}
}
}
}
cout<<"-1";
}
int main()
{
int cas=0;
while(cin>>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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: