hdu 1664 BFS + 数论

来源:互联网 发布:origin软件绘图 编辑:程序博客网 时间:2024/06/08 02:32

这一题主要是要注意一点:

   对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。

所以这题只要先用一个数来搜,搜不到就用两个数搜。

这题还有一点要用visit[mod]来叛重,因为是从小到大搜上去的之后出现相同的余数后就算最后搜到了肯定比之前的大。

AC代码如下:

#include <iostream>#include <queue>#include <string>using namespace std;int N;struct {string s;}ans, tempans;int visit[65537];typedef struct{string now;int mod;}Node;int number[2];bool BFS1(){bool flag = false;for( int i = 1; i <= 9; i++ ){Node temp;temp.now = "";temp.now += i + '0';temp.mod = i % N;while( temp.now.size() < N && temp.mod != 0 ){temp.now += i + '0';temp.mod = ( temp.mod * 10 + i ) % N;}if( temp.mod == 0 ){if( !flag ){tempans.s = temp.now;flag = true;}else if( tempans.s.size() > temp.now.size() ){tempans.s = temp.now;}else if( tempans.s.size() == temp.now.size() && tempans.s > temp.now ){tempans.s = temp.now;}}}if( flag ){ans.s = tempans.s;return true;}else{return false;}}void BFS2(){memset( visit, 0, sizeof( visit ) );queue<Node> q;for( int i = 0; i < 2; i++ ){if( number[i] == 0 ){continue;}Node temp;temp.mod = number[i] % N;temp.now = "";temp.now += number[i] + '0';q.push( temp );}bool flag = false;size_t nowmin = 999999;while( !q.empty() ){Node n = q.front();q.pop();if( flag ){if( n.now.size() > tempans.s.size() ){continue;}else if( n.now.size() == tempans.s.size() && n.now > tempans.s ){continue;}if( n.mod  == 0 ){tempans.s = n.now;continue;}}else if( n.mod == 0 ){flag = true;tempans.s = n.now;continue;}for( int i = 0; i < 2; i++ ){Node temp = n;temp.mod = ( n.mod  * 10 + number[i] ) % N;temp.now += number[i] + '0';if( visit[temp.mod]  ){continue;}visit[temp.mod] = 1;q.push( temp );}}if( ans.s == "" ){ans.s = tempans.s;}else if( tempans.s.size() < ans.s.size() ){ans.s = tempans.s;}else if( tempans.s.size() == ans.s.size() && tempans.s < ans.s ){ans.s = tempans.s;}}int main(){while( cin >> N && N ){ans.s = "";if( BFS1() ){ }else{for( int i = 0; i <= 9; i ++ ){for( int j = i + 1; j <= 9; j++ ){number[0] = i;number[1] = j;BFS2();}}}cout << ans.s << endl;}return 0;}