您的位置:首页 > 其它

2012ACM/ICPC成都赛区现场赛K题---Yet Another Multiple Problem(hdu4474)

2012-12-01 16:23 429 查看
     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4474 

     题意:一个简单的BFS,用没出现的数字进行BFS,最后递归输出结果。

     题解:如果当前在队首的为n ,则接下来要进队的是m=(n*10+i)%n;若m=0,则递归输出结果,相同的m只需进队一次。

代码:

#include <cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int> que;
int used[10];
int flag[10010],pre[10010],vlaue[10010];
//flag[]标记m是否进过对列,pre[]保存前一个m,而vlaue[]则保存对应m的i值
int n,m;
void print(int n)//递归输出结果
{
if(n!=-1)
{
print(pre
);
printf("%d",vlaue
);
}
}
void bfs()
{
for(int i=1;i<=9;i++)
{
if(!used[i] && !flag[i%n])
{
que.push(i%n);
flag[i%n] = 1;
pre[i%n] = -1;//首位的前一个值为-1,作为递归输出的结束条件
vlaue[i%n] = i;
}
}

while(!que.empty())
{
int temp = que.front();
if(temp == 0)
{
print(pre[temp]);
printf("%d\n",vlaue[temp]);
return;
}

else
{
for(int i=0;i<=9;i++)
{
if(!used[i] && !flag[(temp*10+i)%n])
{//数字i未出现,并且(temp*10+i)%n未进队列过,则进队
que.push((temp*10+i)%n);
flag[(temp*10+i)%n] = 1;
pre[(temp*10+i)%n] = temp;
vlaue[(temp*10+i)%n] = i;
}
}
}
que.pop();
}
printf("-1\n");
return;
}
int main()
{
int ncase=1,m1;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(used,0,sizeof(used));
memset(flag,0,sizeof(flag));
while(!que.empty())
que.pop();
for(int i=0;i<m;i++)
{
scanf("%d",&m1);
if(!used[m1])
used[m1] = 1;
}
printf("Case %d: ",ncase++);
bfs();
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: