标签:
7 15 16 101 0
7 555 16 1111
题意:告诉一个数n,求一个他的倍数m,使得m由最少的不同数字组成。
思路:对于任意一个n,都可以找到一个他的倍数,并且这个倍数只有最多2种不同的数字组成。所以,可以分成1种和2种讨论下。
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; struct Node { int mod; string ans; }f,t; int n; string ans,tmp; int num[2]; int vis[70000]; int bfs1() { int flag=0; for(int i=1;i<=9;i++) { f.mod=i%n; f.ans=""; f.ans+=i+'0'; while(f.ans.size()<n && f.mod!=0) { f.ans+=i+'0'; f.mod=(f.mod*10+i)%n; } if(f.mod==0) { if(flag==0) {tmp=f.ans;flag=1;} else if(f.ans.size()<tmp.size()) tmp=f.ans; else if(f.ans.size()==tmp.size() && f.ans<tmp) tmp=f.ans; } } if(flag) {ans=tmp;return 1;} else return 0; } void bfs2() { memset(vis,0,sizeof vis); queue<Node>q; for(int i=0;i<2;i++) { if(num[i]==0) continue; f.mod=num[i]%n; f.ans=""; f.ans+=num[i]+'0'; vis[f.mod]=1; q.push(f); } int flag=0; while(!q.empty()) { f=q.front(); q.pop(); if(flag) { if(f.mod==0) { if(tmp.size()>f.ans.size()) {tmp=f.ans;continue;} else if(tmp.size()==f.ans.size() && tmp>f.ans) {tmp=f.ans;continue;} } } else if(f.mod==0) { flag=1; tmp=f.ans; continue; } for(int i=0;i<2;i++) { t=f; t.ans+=num[i]+'0'; t.mod=(f.mod*10+num[i])%n; if(vis[t.mod]) continue; vis[t.mod]=1; q.push(t); } } if(ans=="") ans=tmp; else if(ans.size()>tmp.size()) ans=tmp; else if(ans.size()==tmp.size() && ans>tmp) ans=tmp; } int main() { while(scanf("%d",&n),n) { ans=""; if(bfs1()); else { for(int i=0;i<9;i++) for(int j=i+1;j<=9;j++) { num[0]=i;num[1]=j; bfs2(); } } cout<<ans<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/47271647