您的位置:首页 > 其它

POJ-1426-Find The Multiple

2013-08-08 13:04 281 查看
这个题要求求出n的m倍都为0和1组成的数,进行BFS搜索,每次尝试去填1和0,只需要记录当前位置的余数,然后注意层数的剪枝。

也就是说我们枚举每一位的时候,只要当前位数的余数存在,那么再次出现当前一样的余数的情况就不用记录当前状态了。

仔细想想吧,模拟除法运算过程应该就能明白了

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=10001;
struct Node
{
char str[200];
int res;
int len;
int step;
}q[maxn];
int n;
bool vis[maxn];
int main()
{
while(scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
int front=0,last=1,ans=-1,count=0;
q[front].res=0;
q[front].len=0;
q[front].step=0;
while(front<last)
{
int res=q[front].res;
if(q[front].step!=count)
{
count=q[front].step;
memset(vis,0,sizeof(vis));
}
if(!vis[(res*10+1)%n])
{
if((res*10+1)%n==0)
{
q[front].str[q[front].len++]='1';
q[front].str[q[front].len]='\0';
printf("%s\n",q[front].str);
break;
}
vis[(res*10+1)%n]=1;
q[last].res=(res*10+1)%n;
q[last].step=q[front].step+1;
memcpy(q[last].str,q[front].str,sizeof(q[front].str));
q[last].str[q[front].len]='1';
q[last].len=q[front].len+1;
q[last].str[q[last].len]='\0';
last++;
}
if(res&&!vis[(res*10+0)%n])
{
if((res*10+0)%n==0)
{
q[front].str[q[front].len++]='0';
q[front].str[q[front].len]='\0';
printf("%s\n",q[front].str);
break;
}
vis[(res*10+0)%n]=1;
q[last].res=(res*10+0)%n;
q[last].step=q[front].step+1;
memcpy(q[last].str,q[front].str,sizeof(q[front].str));
q[last].str[q[front].len]='0';
q[last].len=q[front].len+1;
q[last].str[q[last].len]='\0';
last++;
}
front++;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: