您的位置:首页 > 其它

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];

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: