题意:输入一个数字n,找出一个十进制数找包括0或1,使这个十进制数是n的倍数。
思路:bfs,比方说对于6这个数字,如果i%6 == j%6,那么我们只要保存i,j中的一个就可以了,反正加一个“0”或者“1”之后再对6取模的结果是一样的,用这种方式来剪枝。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define N 1000
#define ll long long
#define INF 0x7fffffff
using namespace std;
bool istried[500];
struct Node{
string num;
int mod;
Node(string a,int b)
{
num = a,mod = b;
};
};
int n;
int main(){
int i,j,k;
int x,y;
while (scanf("%d",&n),n)
{
memset(istried,0,sizeof(istried));
queue<Node>Q;
Q.push(Node("1",1));istried[1] = 1;
while (!Q.empty())
{
Node x = Q.front();Q.pop();
int p = x.mod;
if(p == 0){
cout<<x.num<<endl;
break;
}else{
if(!istried[p*10%n]){
istried[p*10%n] = 1;
Q.push(Node(x.num + "0",p*10%n));
}
if(!istried[(p*10+1)%n]){
istried[(p*10+1)%n] = 1;
Q.push(Node(x.num + "1",(p*10+1)%n));
}
}
}
}
return 0;
}