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;
}
题意: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;
}
相关文章推荐
- HDU_4474_数位bfs——经典搜索
- hdu 4474 Yet Another Multiple Problem 模型转换 BFS搜索 根据剩余类建图广搜
- HDU 4474 Yet Another Multiple Problem(搜索 BFS)
- hdu 4474 数位搜索
- 一类数位限制倍数的BFS问题...URAL 1495,POJ 1465,HDU 4474,HDU 1226
- 2012 Asia Chengdu Regional Contest hdu 4474(数位bfs)
- hdu 4474 搜索bfs
- hdu 4474 数位BFS
- HDU-4474 Yet Another Multiple Problem BFS搜索
- hdu 4474 Yet Another Multiple Problem 模型转换 BFS搜索
- HDU 3709 ZJU 3416 Balanced Number 数位dp 记忆搜索
- 【搜索之BFS】杭电 hdu 1548 A strange lift
- HDU 1175(搜索题,BFS)
- 交换地方HDU 1195 Open the Lock 简单搜索-bfs
- HDU 2612(搜索题,BFS)
- HDU 2579 Dating with girls(2) BFS 又一种新的搜索类型 很好的题
- HDU 1180(搜索题,BFS)
- hdu 1043 八数码 经典搜索问题 BFS+MAP
- HDU-4394 Digital Square BFS搜索
- HDU 4474 BFS