POJ1426:Find The Multiple——BFS

题目描述

定一个n,求n的非零整数倍m,满足m的十进制表示,所有数字均为0或者1

If there are multiple solutions for a given value of n, any one of them is acceptable.

下面的样例输出根据上面这句描述,放了一个烟雾弹,样例输出给的结果非常大,但是只要输出任何一个满足条件的m即可,所有我们可以选择输出最小的

搜索四部曲

状态空间 状态转移 初始状态 目标状态
思路1 n * k n * k + n n n * k
思路2 0,1构成的number number * 10
number * 10 + 1
n number % n == 0

思路1:暴力搜索n的所有非零整数倍m,直到找到符合要求m(十进制所有数字均为0或1)

思路2:反过来考虑,直接搜索所有0,1组成成的数number,看能否满足number % n == 0,否则继续看number0(number * 10)和number1(number * 10 + 1)

显然,思路2要比思路1更高效,搜索树如下

image-20220130082044020

搜索策略选择

由于要选择最小的满足要求的m,因此可以选用BFS策略,即按层搜索

此外,由于所有的搜索结点均不会重复,因此不需要使用visit数组标记重复

代码

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;

void BFS(int n){
    queue<long long> q;
    q.push(1);
    while(!q.empty()){
        long long current = q.front();
        q.pop();
        if(current % n == 0){
            printf("%lld\n", current);
            return ;
        }
        q.push(current * 10);
        q.push(current * 10 + 1);
    }
}

int main(){
    int n;
    while(scanf("%d", &n) != EOF){
        if(n == 0){
            break;
        }
        BFS(n);
    }
    return 0;
}

遇到的坑

使用STL queue提交代码时需要G++编译器,用C++则会TLE,原因不清楚,希望有大佬帮解答

posted @ 2022-01-30 08:26  dctwan  阅读(33)  评论(0编辑  收藏  举报