您的位置:首页 > 其它

hdu 4474 bfs

2015-09-16 11:43 253 查看
和上一题大同小异,经过思考,visit数组可以省去第一维。

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

const int N = 10007;
const int M = 10;
int n, m, head, tail;
bool visit
;
bool digit[M];

struct Node
{
int d, r, pre;
Node(){}
Node( int _d, int _r, int _pre )
{
d = _d, r = _r, pre = _pre;
}
} q
;

void dfs( int x )
{
if ( x == -1 ) return ;
dfs( q[x].pre );
printf("%d", q[x].d);
}

void bfs()
{
memset( visit, 0, sizeof(visit) );
head = tail = 0;
for ( int i = 1; i < M; i++ )
{
if ( !digit[i] && !visit[i % n] )
{
q[tail++] = Node( i, i % n, -1 );
visit[i % n] = 1;
}
}
while ( head < tail )
{
if ( q[head].r == 0 )
{
dfs(head);
putchar('\n');
return ;
}
for ( int k = 0; k < M; k++ )
{
if ( digit[k] ) continue;
int rr = ( q[head].r * 10 + k ) % n;
if ( !visit[rr] )
{
q[tail++] = Node( k, rr, head );
visit[rr] = 1;
}
}
head++;
}
printf("-1\n");
}

int main ()
{
int _case = 1;
while ( scanf("%d%d", &n, &m) != EOF )
{
memset( digit, 0, sizeof(digit) );
while ( m-- )
{
int tmp;
scanf("%d", &tmp);
digit[tmp] = 1;
}
printf("Case %d: ", _case++);
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: