poj 1465 一题非常经典的bfs题
2013-12-14 20:04
197 查看
题意:给出一个数n , 和m个不相同的个位数 , 存在一个数x .
1、 x%n == 0
2、 x中的每个数字都能在那m个数字钟找到 ,
求出最小的x
这题的关键在于
1、剪枝:
a = x*n + c
b = y*n + c
这两个数只要存在一个就行 , 由于是bfs进行搜索 , 所以每次得到的数都是最小的 , 因此只要用一个数来标记余数 ,这就是余数剪枝
2、大数处理
这题的最后得到的x肯定很大 , 但是用数组模拟大数有太麻烦了 , 我们这里用一个结构体数组 , 每个结构体只存储刚加入的那个数字 ,也就是个位数
struct st //这是一种大数的处理方法
{
intpre;//前一个状态 , 和前一个数连接
intr;//余数
intd;//个位数
}w,v;
输出:
void output(int front)
{
if(q[front].pre == -1) return ;
output(q[front].pre);
cout<<q[front].d;
}
代码:
int n , m;
int xy[20];
int pre[5010];
struct st //这是一种大数的处理方法
{
intpre;//前一个状态
intr;//余数
intd;//个位数
}w,v;
st q[5010];
void output(int front)
{
if(q[front].pre == -1) return ;
output(q[front].pre);
cout<<q[front].d;
}
void bfs()
{
int i;
int front =0 , rear = 0;
w.pre =-1;
w.r =0;
w.d =0;
q[rear++] =w;
pre[0] =1;
int y ,k;
while(front< rear)
{
w =q[front];
for(i
= 0; i< m; i++)
{
y =w.r*10+xy[i];
if(y >= n&& y%n == 0)
{
output(front);
cout<<xy[i]<<endl;
return;
}
k =y%n;
if(pre[k] ==0)
{
pre[k] =1;
v.pre =front;
v.r =k;
v.d =xy[i];
1、 x%n == 0
2、 x中的每个数字都能在那m个数字钟找到 ,
求出最小的x
这题的关键在于
1、剪枝:
a = x*n + c
b = y*n + c
这两个数只要存在一个就行 , 由于是bfs进行搜索 , 所以每次得到的数都是最小的 , 因此只要用一个数来标记余数 ,这就是余数剪枝
2、大数处理
这题的最后得到的x肯定很大 , 但是用数组模拟大数有太麻烦了 , 我们这里用一个结构体数组 , 每个结构体只存储刚加入的那个数字 ,也就是个位数
struct st //这是一种大数的处理方法
{
intpre;//前一个状态 , 和前一个数连接
intr;//余数
intd;//个位数
}w,v;
输出:
void output(int front)
{
if(q[front].pre == -1) return ;
output(q[front].pre);
cout<<q[front].d;
}
代码:
int n , m;
int xy[20];
int pre[5010];
struct st //这是一种大数的处理方法
{
intpre;//前一个状态
intr;//余数
intd;//个位数
}w,v;
st q[5010];
void output(int front)
{
if(q[front].pre == -1) return ;
output(q[front].pre);
cout<<q[front].d;
}
void bfs()
{
int i;
int front =0 , rear = 0;
w.pre =-1;
w.r =0;
w.d =0;
q[rear++] =w;
pre[0] =1;
int y ,k;
while(front< rear)
{
w =q[front];
for(i
= 0; i< m; i++)
{
y =w.r*10+xy[i];
if(y >= n&& y%n == 0)
{
output(front);
cout<<xy[i]<<endl;
return;
}
k =y%n;
if(pre[k] ==0)
{
pre[k] =1;
v.pre =front;
v.r =k;
v.d =xy[i];
相关文章推荐
- hdu 1026 简单的bfs
- hdu1728 很有难度的bfs…
- poj 1733 并查集+偏移向…
- poj 1182 并查集经典题…
- poj 1611 并查集训练
- poj 1703 并查集的拓展
- HDU 4277 USACO ORZ
- poj 1836 最长增长序列的变形
- 集合中子集的生成算法
- poj 1742
- LA 4726 Average
- 动态规划求 最长递增子序列
- 01背包和完全背包比较容易忽略的地…
- Distant Galaxy poj 3141
- unipue() 函数的功能
- poj 2015 Permutation Code
- poj 1088 经典的记忆化搜索
- 中位数的应用
- poj 1724
- poj1511(第一次用数组模拟邻接表…